ImportExport
8.0.8
OFORK
https://o-fork.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
New release.
New release.
Added new functions.
Added new functions.
Added new functions.
Added new functions.
Added new functions.
Init release.
The ImportExport package.
Das ImportExport Paket.
8.0.x
</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>
((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>
((enjoy))</br>
</br>
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
2019-09-02 08:43:42
localhost
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uWpmXEhISEhIiJMbBYCeJmevuHmASVr13N/ff/To0X//+99d3R3PExsbK62h3u2USiUz4wCPQHQJAICfsKo3AHQjNw8qybq2xjksZWZm9kS1L774Yk9UC6Dbse4SAAA/kW6EOnyKEADA5SIiIhQ2IiIiXN0vALgZkbuEm8sLL7wg/xcAbJG7BACe4tKlS67uAgDgR54UXdLr9YcOHTp16pRWq21ubu7bt+/AgQNHjhw5YcIEPz8/eTfHAwcvvPCC1c6+vr79+/e/5ZZb7r777sDAQKv9TSbT4cOHi4qKqqqqWlpa+vTpM3DgwKFDh44ZM2bQoEEONlpeXv7tt9+eP3++oaHB399/6NChEydOHDJkiCO97cJbAIBOIboEAABuTr34l3j7g+qVQ3Y+j4kunT9//oMPPqivr5dLGhoaGhoazp8/f+DAgUWLFjkSoOmQwWDQarVarfbYsWPLli2zfGCQXq//3//937KyMrmkqamprKysrKwsPz/fwX+O//73v7/66it5/nl9fX1RUVFRURH/mgHATZhMJkF0CQAAwNP0+uiYmw/NM6JLZWVl77zzjtFojIyMvPvuu4cMGeLv79/U1HThwoUDBw5oNJp33nnn17/+dXR0tGjrjHf4l5DfamhoKCsr+/zzz2tqavbu3fvAAw/I+/z73/8uKysLCAi45557br311sDAQIPBcPny5XPnzhUVFTkyioKCgn//+99eXl6TJ08eN25caGhoc3NzaWnpt99+6/ipcPN/TwDg6chdAgAA6JW4m+5RHhBdMhqNH330kdFovPPOO+fMmSOvtBoYGDh69OhRo0b961//OnLkyIcffrh8+XJvb+8baSsgIGDUqFH9+vV76623SktLLd86fvy4EGLBggUjRoyQSry9vaOjo6Ojo6dOndphzQ0NDXv27BFCzJ49e9y4cXJzt99+++23334jfQYAdCOiSwAAdBej0XiDN2gAPIUHRJe+//57nU4XFhY2e/Zs24f4eHl5zZ49W6PRSNPZ7rzzzhtvUVpEqaWlxbKwrq5OCBETE9O1Oo8eParX62NiYuTQUk+QYrF//OMfDx8+XFhYePnyZYPB8Mc//lEIodFojhw58sMPP9TU1CgUipCQkJEjR06ZMsXf39+2hhdeeOHIkSMFBQVardbLyysmJiYxMVE6LUePHpXKzWZzTExMUlKS7ZpTNTU1arX67NmztbW1Pj4+KpVq0qRJo0aNknf47//+b51O99hjj6lUKqkkLy/v6NGjQog77rhj/vz5UuHFixezs7NDQ0PT09PlY8vKytRqdVlZWVNTk7+//+DBgydPniylrTlyHmy1tLR8/PHHJSUlXl5eKSkpEydO7ORZB9CrEF0CcHNSKBTy6g29Rl5eXmpqamBg4B133LFv3z5Xd8eNSF9z3fsXf/7559euXSu9NpvN5eXldXV1qampx44dk/fZv3//m2++2dDQ8M9//tPX13fr1q3SlX975VbVwvlu/PZQvjUrLCw8fPjw5cuXFQpFVFTUlClThg8fbtXcjdzryXlJlglKnU1W+uSTTw4dOhQcHPzoo49aLsRcX1//5ptv1tbWTpgw4f777/fEoTmBB0SXSkpKhBAJCQnthb29vb0nTZr0ySeflJSUdEt06eLFi0KI4OBgy8KgoKCrV6+eOXNm9OjRXajz7NmzQoixY8feePc69Omnnx46dMiqcNOmTZably9fvnz5cnFx8W9/+9t+/fpZ7bxr1y7L+XqnT58+f/78b3/724KCgu+++04uP3v2bHl5+WOPPaZUKi0Lt27dqtfrpc3W1tZz586dO3fu5z//+b333isVDh8+vLCw8Ny5c3J06dy5c1YvhBBS+tiwYcPkkoKCgp07d1ouXFVcXHzixIn7779//PjxjpwHKzU1Ne+9915VVVW/fv0efPBBy7YA3JxsrwacwGw2V1ZWent7h4WFEdgC0KNUKpV0rWulU4GGxsZG2wvInhYUFCT93Ou41NRUyziFc3Shn85nNpu79+vm9OnTNTU18uaxY8dKS0vnzp1rtYTIo48+evDgQWlxW7VanZycLK2r2165EKKmpqa0tNQl386Q3cjtoWTnzp0FBQXyZmlp6blz52bOnGn503633+t1QUpKSlVV1YULF7Zt2/arX/1KCkEYjcatW7fW1tYOHjw4JSXFQ4fmBB4QXaqoqBDXhxhsSe9Ke96IxsbG8+fPf/7550IIqwlrY8eOzc/P//jjj8+ePTty5MioqKiAgADHa66qqhJCxMTEHD9+XK1WV1VVeXt7h4eHjxs37s477+zeD/fDhw9Pnjw5Li5OqVTK2V5Dhw4dP3784MGDAwMD9Xp9RUXF3r17NRpNfn7+9OnTrWooKCi4++674+LigoODL126tH37dq1W++6779bW1tqW5+fnz507VzqwtrZ227Zter3+9ttvnzx58oABA5qamo4fP75v3779+/ePGDFCWnx92LBhUnRp8uTJQojLly/X1tYGBgaazeba2trLly8PHDhQXIs0yX/6ysrKXbt2mc3mcePGTZkypX///jqdLj8//8iRIzt37oyJiQkPD+/wPFj64Ycftm3b1tjYGB4e/stf/tJyEXcAcCaTySRdRlt9jgFAt6usrLQq2blz56xZs4RFgEm6NH311VdXr179+eefnzhx4r/+67/eeeed+fPna7XamTNnHjp0KDw8/MEHH3zllVekMFN4eHhra2t1dbUQQqlU+vr6Xrp0Sa7qiy+++OUvfzl48OCPPvpIuho0GAz/7//9v7y8PLPZPG/evLVr10rPgJb2r6mpefrpp7dt2/a73/1u/fr1Up319fXyNXOHsbAhQ4ZcuHBBCLFgwQLLQzrVrp3zIIRYvnz57t27y8vLJ0+evGrVqnvuuafDfsbHxwshLO/G22R1uNVmm+22d96am5ufffbZ999/38vLa926dX/+859PnTolN7R37960tLSqqirLGFyn6pdt2rQpOTlZ3hw7dmybP6u3tLTIl9yTJ09uaGiwXy6ESExMzM7Ofvnll+2fNPSoLt8eWtYwfvz4u+++OyQk5OrVq19//XVhYeFnn302dOjQsLAw0R33evIT4W8kqcfb2zs1NfXNN9+8cOHCzp07Z8+eLYT49NNPy8rKQkJCUlNTbVNePGVoTtDGLbe7aWxsFDaZRFakd6U9u+CFa1555ZWtW7fqdLrbb7/95z//ueU+06ZNu+OOO1pbWw8fPvyPf/xj/fr1r776qhRscqSJpqYmIURRUdEHH3yg0WgMBkNzc/OFCxe2b9/+wQcfOP5j0Qs2bPeZOHFicnLywIEDLUMqS5cuvf3220NCQry9vf39/UeMGLFo0SIhhOUXjOzuu+9OSkoaMGCAr69vdHT0zJkzhRA6na7Ncstso2+++aalpeWOO+544IEHVCqVn59fSEjI5MmT77vvPmHxVSoFjM6fP280GoVFFEkqlzaNRuP58+eFRXTp22+/NZlMsbGxc+fOHTBggLe394ABA+bNm3fLLbcYjcZvvvnGkfMgO3To0DvvvNPY2Dhy5Eir5wMCgJNJH4ZtflgBQE+bOXOm1bWotGk0Gjdv3jxr1qyioqLN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i2NjY1tbW99///1jx47dyMAB4EYwMw5Ab2WV/oPeKjY21moJnu6iVCqZGdcLWN3E7dixo6SkxPImrlvu9aR0of/7v/9zPBJtq7KyUrpJl54EFxMTk5SUZDab//nPf1o9ddHjhtbTPCB3SQgRExOTlpa2bdu2iooKKZpjKSAg4MEHH4yJienGFm+77bbQ0NArV66UlJRIEUqtVqvVaqWl9Wy7N23aNPsVKhSKhQsXvvXWW/X19Xl5eZZv3XHHHdLy3j1n2rRp//jHP86cOSM9000SHx//3XffdW9DQUFBDz300NatW0tKSqQpb3YMHz5citdGRETID3cMCAgIDw+XflWzXNJbCDFo0KCUlJSdO3cePnzY8pcfhUIxc+ZMKYLWKT4+PqmpqR988MHJkyc//vjjlpYWz12fH0C3MBgMNTU10pNindku0SUAvRXrMd88MjMze6LaF198sSeqhZNNnDixoKDA6iZuxowZ8lzdbrnXGz16dH5+/mefffbZZ59JJVbLeLe3qrdcrtfrP/zww9bW1vHjx//sZz+TChMSEi5cuFBcXLxt27bf/OY3VlOC3GRo7sAzoktCiCFDhqSnpx86dKikpESr1TY3N/ft2zcsLCw2NnbChAndnh7m5eV111137dy588CBA1J06fHHHz958uT58+erqqqkZ5/169cvIiJizJgxd9xxhyO3BEql8j//8z/z8/NLSkpqa2t9fX0HDRo0fvz47prQZ8ett9760EMP7d+//+LFi15eXmFhYePHj4+Li+v26JIQIjo6+ve//730l7p8+bL0pIwBAwbceuutVhleMTExUoKfVRRp+PDhly5d8vHxsUodFEJMnDgxIiLi4MGDFy5caGpq8vf3Hzx48OTJk7scW/T29l60aNFHH310/PjxTz75pLm52fZRkQBuHgaD4erVq9KnljPbJboEAF0QEREhLVxiSf6dEoD7mDlzZnh4eGFh4eXLlxUKRVRU1JQpU0aMGGG5z43f6/3iF78wm83FxcVXr15tb9Vm+z799NPLly+Hh4fPmDHDsnzu3LmXLl2qrKz89NNP586d64lDc4IbeiIpAAC9iV6vr62t9fHx6aH0/vZcvHixvr4+PDxcXgAS6Ky4uLijR4+67RUnXCI/Pz89Pb2wsNDVHQF6SkJCQmZmZmJioqs7gnZJKTZumGhz43rx0LrGY3KX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fX19FotlWKdcvHjRuzEAgLdEqR0AAHgoKipKr9c3NTVdffXV9vFHO3fufOWVV8aMGSOE2LZt23XXXffkk08qu5555hn7N34DnutosLzAiy+++Nprr+Xk5Aghnn322W9/+9tXfiFGo3HHjh0lJSV9fX29vb3x8fF5eXm//vWv7Qd88MEHLk4fM2bM1Vdf7XHrp0+fvpKkGAYky7LJZBJCxMXFqR2L91VVVU2ePFntKADAE59//rnSgzn+R698JfDUU09t2rTpzTff7O3tXbRo0e7duxcuXKgc0NzcXFRU9Mknn2RkZNxxxx2//e1vExIShBC5ubn19fU5OTl1dXVCiNGjR587d+6qq646f/68UueJEyfuuOOO+vr6BQsW/P73v09MTFQq7O7uvvfeeysrK00mU15e3r59+5KTkx2DaWtrW7t27YEDB+6+++5nnnlGCHHNNdfU1taKr47pdv01xpDXJYRYsWLFn/70p9TU1C1btixatMjxxAGDd31dA95e+1l79+594oknTp48KYTYt2+fEkZPT8+aNWsOHDgwZsyYP/7xjxMnThzyugAEJsYuAQhWr7zyytGjR6dMmTJ+/Hj7MKJz585NnDhRkiRJkkaOHHnhwgX78Y4pmAHPdZSVlTVgzqW+vn7s2LHK9jXXXOO4S6/XDzjcaUi9vb3t7e1Wq9X+vMhymAhk3/rWt4qKitSOAgA8MWnSpP6ZC6XEarXu3r37e9/73n/913/t3LmzuLjYfsC6deu2bdtmNptra2tnz569bt06pbyuru7MmTM/+MEPDAaDzWYrKSmpq6s7f/68vc5jx44dPXq0o6Nj6tSpDz/8sL3CjRs3bty48fz5842NjevWrdu4caNTMN///vdvuukmvV6vpJaEEGfOnFF2yQ5cX+yQ1yWEeO655xoaGl588cUf/ehHTicOGLzr6xrw9trPevPNNw8ePGgymfbt22cPY/369TqdrqGhoaKi4siRI4LUEhC8ZAAIbHFxcUajUdlWBoQ77rXZbG+88cbIkSOVjxMmTPjyyy/7VzJgd+d0rqM77rhjz549/U//2te+duLECWW7qqrKsdrdu3cvWbLE7cty1traunHjxoSEhJiYmNTU1J6eHo+rgupsNltNTU1NTY3ValU7FoSLBx98MD09Xe0oAP/Jysqqqanx7Nz+TwX2EiGEzWZzOsbpt02d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vf/++8OHD3/33XeVU1u3bi0tLd29e3d7e/vu3btLS0u3b9+uXjVq1Kjdu3d7PJ64u3esp6NgMDhlypSXXnpJefniiy9OnTo1GAz2dklIDysMAQAAAAAYEtRthiRJ+vjjj6+++mqlvbGxsaCg4JNPPhk7dqzactlll507d07pvH379ltuuUU5tW3btp/97GcffPCBEOLaa69dsmTJbbfdppwqLy9/9tln//jHPypX7d27d+rUqR3vHtvSsUi1T0NDw7XXXvurX/1KCDF//vw//elPBQUF6oW9VBLSw/sIAAAAAMCQEJsuRSIRnU4Xe6pji9q5paUlOztbaW9paRk5cqSybs7pdJ48eTInJ0c9dfHFFzc3NytX+Xy+jIyMjgMmaYnzySefzJ8/32AwvP7662ry1aslIT3suwQAAAAAwJATGyQlajlPsTlOev785z87HI5AIHD27Nl+UhI6RboEAAAAAACS2bdvn3r84YcffvWrX1WOL7vssr1798ae+spXvpJoEIPBEIlEUr/pp59++uMf//jtt99+6623vvvd7548eVLzkpAI6RIAAAAAAEjmkUce+fDDD91u9wcffPC9733vhz/8odL++OOPP/roox988IF6aunSpYkGGT58+HvvvReNRlO5o8fjmTdv3s9+9rOLL754/Pjx/+///b+5c+f6/X4NS0ISrDAEAAAAAGBIiN1KqcstkGI7v/zyy2vXrj1z5kxZWdmTTz65aNEitdu6deuUUyNGjFi6dOl3vvOdRANu3br18ccfP3v2bCQSUUfuWKRy6r777tPr9a+88orafvfdd1sslk2bNvVqSUgP6RIAAAAAAEioH2593Q9LGuJYGQcAAAAAAID0kS4BAAAAAAAgfcwlAwAAAAAAQPqYuwQAAAAAAID0kS4BAAAAAAAgfaRLAAAAAAAASB/pEgAAAAAAANJHugQAAAAAwJBz5syZyspK5djtdp8+fVo5DgQCTU1NQgiPx1NVVVVVVVVXVxd7YWznpqamo0ePJhm50w4YfPjOOAAAAAAAhpbt27f//e9/b25uvvDCC+fOnfv973//iiuuMJvNt95663/+5382NjZu27bt448//p//+R+fz3fw4MGdO3cqF9bW1qqdr7/++pUrV06aNOnkyZPr1q3rOPLkyZM7dsCgRLoEAAAAAMBQ1N7e/uCDD06aNGnMmDH/9m//NmfOnK1btwohbrvttm3btil9fvnLXxoMhrvuukt5+eKLL6qdFy9efOLEiQULFjz00EO/+tWvOo589913J+qAQYaVcQAAAAAADDmyLD/xxBNLlixpbGzMz89P1K28vHz27NmnTp36+OOPfT5fbOexY8ceOHDg0UcfnTVrltohduTYDn30VNAI6RIAAAAAAEPO448/fscdd1x55ZUlJSU1NTVCCEmS4vqcOHGitLQ0IyOjpqbm6NGjfr8/tvOmTZu+//3vv/7661u3blU7xI4c26HvHxB9yaB1AQAAAAAAoE/94he/2LNnTyAQOHTo0De/+c0HHnjgD3/4w80339zc3LxixYq///3vzzzzzLJly1555ZVvfetbQogpU6ZMmTJFCDF37ly185gxY9asWTNq1KgLLrhA7RA78owZM9QO2j4vehv7LgEAAAAAMKTJsuz3+y0WS3c7h8Nhn89nt9sTde6yAwaH/w/RBIPnLF0HVwAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvZm9ya19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJGcmFtZXdvcmsiPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FkbWluSW1wb3J0RXhwb3J0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkltcG9ydC9FeHBvcnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWRtaW5JbXBvcnRFeHBvcnQjIyMwMDEtSW1wb3J0RXhwb3J0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5JbXBvcnRFeHBvcnQuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZG1pbi5JbXBvcnRFeHBvcnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluSW1wb3J0RXhwb3J0IyMjMDAxLUltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYWluIG1lbnUgaXRlbSByZWdpc3RyYXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TWFpbk1lbnU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZE5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uTW9kdWxlIyMjQWRtaW5JbXBvcnRFeHBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWRtaW4gYXJlYSBuYXZpZ2F0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkFkbWluT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+YWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0L0V4cG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPkFkbWluaXN0cmF0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+TWFuYWdlIGltcG9ydCBhbmQgZXhwb3J0IG9mIG9iamVjdHMuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uQmlnIj5mYS1hcnJvd3MtaDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvblNtYWxsIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uIyMjQ1NWIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkltcG9ydEV4cG9ydDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+Q1NWPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vZm9ya19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JbXBvcnRFeHBvcnQucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogZGVfSW1wb3J0RXhwb3J0LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjE2OjA0IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICdJbXBvcnQvRXhwb3J0LVZlcndhbHR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0Vyc3RlbGxlbiBlaW5lciBWb3JsYWdlIHp1bSBJbXBvcnRpZXJlbiB1bmQgRXhwb3J0aWVyZW4gdm9uIE9iamVrdC1JbmZvcm1hdGlvbmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbXBvcnQgc3RhcnRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdFeHBvcnQgc3RhcnRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnU2Nocml0dCAxIHZvbiA1IC0gQWxsZ2VtZWluZSBJbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdOYW1lIHdpcmQgYmVuw7Z0aWd0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZWt0IGlzdCBlcmZvcmRlcmxpY2ghJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgaXN0IGVyZm9yZGVybGljaCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ1NjaHJpdHQgMiB2b24gNSAtIE9iamVrdC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ1NjaHJpdHQgMyB2b24gNSAtIEZvcm1hdGluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICd3aXJkIGJlbsO2dGlndCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdTY2hyaXR0IDQgdm9uIDUgLSBNYXBwaW5nLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnS2VpbmUgTWFwcGluZy1FbGVtZW50ZSBnZWZ1bmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ01hcHBpbmctRWxlbWVudCBoaW56dWbDvGdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnU2Nocml0dCA1IHZvbiA1IC0gU3VjaC1JbmZvcm1hdGlvbmVuIGJlYXJiZWl0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdFeHBvcnQgcGVyIFN1Y2hlIGVpbnNjaHLDpG5rZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0LUluZm9ybWF0aW9uZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdRdWVsbC1EYXRlaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ0RhdGVuc8OkdHplJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdFcmZvbGdyZWljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdEb3BwZWx0ZSBOYW1lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ1p1bGV0enQgdmVyYXJiZWl0ZXRlIFplaWxlIGRlciBJbXBvcnQtRGF0ZWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJ0tlaW4gQmFja2VuZCBmw7xyIGRhcyBPYmpla3QgdmVyZsO8Z2JhciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnS2VpbiBCYWNrZW5kIGbDvHIgZGFzIEZvcm1hdCB2ZXJmw7xnYmFyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnVm9ybGFnZSBuaWNodCB2ZXJmw7xnYmFyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICdEZWkgVm9ybGFnZSBrb25udGUgbmljaHQgZXJzdGVsbHQgb2RlciBha3R1YWxpc2llcnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICdEaWUgSUQgZGVyIFZvcmxhZ2Ugd2lyZCBiZW7DtnRpZ3QhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICdGZWhsZXIgYXVmZ2V0cmV0ZW4uIEltcG9ydGllcmVuIHVubcO2Z2xpY2ghIEbDvHIgRGV0YWlscyBzaWVoZSBTeXNsb2cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICdGZWhsZXIgYXVmZ2V0cmV0ZW4uIEV4cG9ydGllcmVuIHVubcO2Z2xpY2ghIEbDvHIgRGV0YWlscyBzaWVoZSBTeXNsb2cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICdWb3JsYWdlbmxpc3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJ1phaGwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICdaYWhsIGdyw7bDn2VyIGFscyBOdWxsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICdHYW56emFobCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICdHYW56emFobCBncsO2w59lciBhbHMgTnVsbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICdFbGVtZW50IGVyZm9yZGVybGljaCwgYml0dGUgZsO8Z2VuIFNpZSBEYXRlbiBlaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICdVbmfDvGx0aWdlIERhdGVuLCBiaXR0ZSBnZWJlbiBTaWUgZWluIGfDvGx0aWdlcyAlcyBlaW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICdGb3JtYXQgbmljaHQgZ2VmdW5kZW4hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NwYWx0ZW50cmVubmVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU2VtaWNvbG9uICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb3BwZWxwdW5rdCAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bmt0ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdLb21tYSAoLCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ1plaWNoZW5zYXR6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICdNaXQgU3BhbHRlbsO8YmVyc2NocmlmdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ1NwYWx0ZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdC1CYWNrZW5kIE1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnRpZXJlbiB1bmQgRXhwb3J0aWVyZW4gdm9uIE9iamVrdC1JbmZvcm1hdGlvbmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0V4cG9ydCc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjE2OjA0IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoY29tbW9uKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDEnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGE7CiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJFNhdmVDb250aW51ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXROZXh0JyApOwoKICAgICAgICBpZiAoICEkU2F2ZUNvbnRpbnVlICkgewoKICAgICAgICAgICAgIyBpZiBuZWVkZWQgbmV3IGZvcm0KICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MSgKICAgICAgICAgICAgICAgICAgICBOZXcgPT4gMSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIHRoZXJlIGlzIHRlbXBsYXRlIGlkCiAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBlZGl0CiAgICAgICAgICAgIGlmICggJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDEoICVQYXJhbSwgJXskVGVtcGxhdGVEYXRhfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIHNhdmUgJiBjb250aW51ZQogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKCiAgICAgICAgIyBnZXQgYWxsIGRhdGEgZm9yIHBhcmFtcyBhbmQgY2hlY2sgZm9yIGVycm9ycwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KENvbW1lbnQgT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgVGVtcGxhdGVJRCkpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+eyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgaXMgYSBuZXcgdGVtcGxhdGU/CiAgICAgICAgbXkgJE5ldzsKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICROZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgZmllbGRzCiAgICAgICAgIyBmb3IgbmV3IHRlbXBsYXRlcwogICAgICAgIGlmICgkTmV3KSB7CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntPYmplY3R9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3J7Rm9ybWF0fSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIGZvciBhbGwgdGVtcGxhdGVzCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e05hbWV9ICkgewogICAgICAgICAgICAkU2VydmVyRXJyb3J7TmFtZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBzb21lIGVycm9yCiAgICAgICAgaWYgKCAkU2VydmVyRXJyb3J7Rm9ybWF0fSB8fCAkU2VydmVyRXJyb3J7T2JqZWN0fSB8fCAkU2VydmVyRXJyb3J7TmFtZX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQxKAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgPT4gXCVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgICAgIE5ldyAgICAgICAgID0+ICROZXcsCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CgogICAgICAgIGlmICgkTmV3KSB7CiAgICAgICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4KICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQyO1RlbXBsYXRlSUQ9JFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAob2JqZWN0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDInICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZGVkIFRlbXBsYXRlSUQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRTdWJtaXROZXh0ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdE5leHQnICk7CgogICAgICAgIGlmICggISRTdWJtaXROZXh0ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MiggVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRlbXBsYXRlIHN0YXJ0cyBoZXJlCgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwoKICAgICAgICBteSAkRXJyb3IgPSAwOwogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgICAgICBteSAlRGF0YVR5cGVFcnJvcjsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQgYW5kIGlzIG5vdCB0aGVyZQogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgICRFcnJvciA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBsb29rIGZvciByZWdleHAgZm9yIGRhdGEgdHlwZSBhbGxvd2VkCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntJbnB1dH0tPntSZWdleH0KICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgICAgICEkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9fiAkSXRlbS0+e0lucHV0fS0+e1JlZ2V4fQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgJERhdGFUeXBlRXJyb3J7ICRJdGVtLT57TmFtZX0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWxvYWQgd2l0aCBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCRFcnJvcikgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MigKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICAgICAgPT4gXCVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgICAgIERhdGFUeXBlRXJyb3IgICAgPT4gXCVEYXRhVHlwZUVycm9yLAogICAgICAgICAgICAgICAgVGVtcGxhdGVEYXRhRm9ybSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgICAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIG9iamVjdCBkYXRhCiAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIE9iamVjdERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDM7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKGZvcm1hdCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQzJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWRlZCBUZW1wbGF0ZUlEIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkU3VibWl0TmV4dCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXROZXh0JyApOwoKICAgICAgICBpZiAoICEkU3VibWl0TmV4dCApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDMoIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSBzdGFydGluZyBoZXJlCgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJEZvcm1hdEF0dHJpYnV0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgICAgIG15ICRGb3JtYXREYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEVycm9yID0gMDsKICAgICAgICBteSAlU2VydmVyRXJyb3I7CgogICAgICAgICMgZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmb3JtCiAgICAgICAgbXkgJUF0dHJpYnV0ZVZhbHVlczsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRGb3JtYXRBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGZvcm0gZGF0YQogICAgICAgICAgICAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgSXRlbSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVsb2FkIGZvcm0gaWYgdmFsdWUgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Zvcm19LT57SW52YWxpZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbG9hZCB3aXRoIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQzKAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgPT4gXCVTZXJ2ZXJFcnJvciwKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBmb3JtYXQgZGF0YQogICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBGb3JtYXREYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQ0O1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChtYXBwaW5nKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDQnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9IH0sCiAgICAgICAgICAgICAgICBGb3JtYXROYW1lID0+ICRGb3JtYXRMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgICAgICBteSAkTWFwcGluZ0xpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgaGVhZGVycyBmb3Igb2JqZWN0IGFuZCBhZGQgY29tbW9uIGhlYWRlcnMKICAgICAgICBteSBASGVhZGVyczsKCiAgICAgICAgZm9yIG15ICRIZWFkZXIgKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlcnMsICRIZWFkZXItPntOYW1lfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQ29tbW9uSGVhZGVyICggJ0NvbHVtbicsICdVcCcsICdEb3duJywgJ0RlbGV0ZScgKSB7CiAgICAgICAgICAgIHB1c2ggQEhlYWRlcnMsICRDb21tb25IZWFkZXI7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEhlYWRlciAoQEhlYWRlcnMpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0VGFibGVIZWFkZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgSGVhZGVyID0+ICRIZWFkZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB0byB1c2UgaW4gY29sc3BhbiBmb3IgJ25vIGRhdGEgZm91bmQnIG1lc3NhZ2UKICAgICAgICBteSAkSGVhZGVyQ291bnRlciA9IEBIZWFkZXJzOwoKICAgICAgICBteSAkRW1wdHlNYXAgICAgICAgICAgICA9IDE7CiAgICAgICAgbXkgJEF0dHJpYnV0ZVJvd0NvdW50ZXIgPSAwOwogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgJEVtcHR5TWFwID0gMDsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgIG15ICRNYXBwaW5nRm9ybWF0RGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ09iamVjdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdPYmplY3Q6OicgLiAkQXR0cmlidXRlUm93Q291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgID0+ICRNYXBwaW5nT2JqZWN0RGF0YS0+eyAkSXRlbS0+e0tleX0gfSwKICAgICAgICAgICAgICAgICAgICBJRCAgICAgPT4gJEl0ZW0tPntLZXl9IC4gJEF0dHJpYnV0ZVJvd0NvdW50ZXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICdPYmplY3Q6OicgLiAkQXR0cmlidXRlUm93Q291bnRlciAuICc6OicgLiAkSXRlbS0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZyA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICA9PiAkQXR0cmlidXRlUm93Q291bnRlciwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGNvbHVtbiBjb3VudGVyCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0TWFwTnVtYmVyQ29sdW1uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciA9PiAkQXR0cmlidXRlUm93Q291bnRlciwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBoaWRlIHRoZSB1cCBidXR0b24gZm9yIGZpcnN0IGVsZW1lbnQgYW5kIGRvd24gYnV0dG9uIGZvciB0aGUgbGFzdCBlbGVtZW50CiAgICAgICAgICAgIG15ICRVcEJsb2NrOwogICAgICAgICAgICBteSAkRG93bkJsb2NrOwogICAgICAgICAgICBteSAkTnVtYmVyT2ZFbGVtZW50cyA9IEB7JE1hcHBpbmdMaXN0fTsKCiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZVJvd0NvdW50ZXIgPT0gMCApIHsKICAgICAgICAgICAgICAgICRVcEJsb2NrID0gJ1RlbXBsYXRlRWRpdDROb1VwQnV0dG9uJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRVcEJsb2NrID0gJ1RlbXBsYXRlRWRpdDRVcEJ1dHRvbic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFzdCBlbGVtZW50CiAgICAgICAgICAgIGlmICggJEF0dHJpYnV0ZVJvd0NvdW50ZXIgPT0gKCAkTnVtYmVyT2ZFbGVtZW50cyAtIDEgKSApIHsKICAgICAgICAgICAgICAgICREb3duQmxvY2sgPSAnVGVtcGxhdGVFZGl0NE5vRG93bkJ1dHRvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRG93bkJsb2NrID0gJ1RlbXBsYXRlRWRpdDREb3duQnV0dG9uJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB1cCBidXR0b24gYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRVcEJsb2NrLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lEIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvd24gYnV0dG9uIGJsb2NrCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRG93bkJsb2NrLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lEIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQXR0cmlidXRlUm93Q291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYW4gZW1wdHkgbGlzdAogICAgICAgIGlmICgkRW1wdHlNYXApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ0Tm9NYXBGb3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2x1bW5zID0+ICRIZWFkZXJDb3VudGVyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVTYXZlNCcgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgbXkgJVN1Ym1pdCA9ICgKICAgICAgICAgICAgU3VibWl0TmV4dCA9PiAnVGVtcGxhdGVFZGl0NScsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDMnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICAgICAgTWFwcGluZ0FkZCA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGFjdGlvbgogICAgICAgIG15ICRTdWJhY3Rpb24gICAgPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgbXkgJFN1Ym1pdEJ1dHRvbiA9ICcnOwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIHNvcnQga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uICAgID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgJFN1Ym1pdEJ1dHRvbiA9ICRTdWJtaXRLZXk7CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBmb3JtYXQgYXR0cmlidXRlcwogICAgICAgIG15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgTUFQUElOR0lEOgogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZSB2YWx1ZXMKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZVZhbHVlczsKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ09iamVjdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IG9iamVjdCBmb3JtIGRhdGEKICAgICAgICAgICAgICAgICRPYmplY3RBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnT2JqZWN0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU9iamVjdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgIG15ICVGb3JtYXRBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmb3JtYXQgZm9ybSBkYXRhCiAgICAgICAgICAgICAgICAkRm9ybWF0QXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ0Zvcm1hdDo6JyAuICRDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbWFwcGluZyBmb3JtYXQgZGF0YQogICAgICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgTWFwcGluZ0Zvcm1hdERhdGEgPT4gXCVGb3JtYXRBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgTUFQUElOR0lEOgogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBkZWxldGUgdGhpcyBtYXBwaW5nIHJvdwogICAgICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRGVsZXRlOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IHVwCiAgICAgICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIk1hcHBpbmdVcDo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdVcCgKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbW92ZSBtYXBwaW5nIGRhdGEgcm93IGRvd24KICAgICAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ0Rvd246OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRG93bigKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nSUQgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBNQVBQSU5HSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIGEgbmV3IG1hcHBpbmcgcm93CiAgICAgICAgaWYgKCAkU3VibWl0QnV0dG9uIGVxICdNYXBwaW5nQWRkJyApIHsKICAgICAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPSRTdWJhY3Rpb247VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKHNlYXJjaCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZUVkaXQ1JyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICAgICAjIGdldCBzZWFyY2ggZGF0YQogICAgICAgIG15ICRTZWFyY2hEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHJlc2NyaWN0IGV4cG9ydCBzdHJpbmcKICAgICAgICBteSAkUmVzdHJpY3RFeHBvcnRTdHJnID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICBJdGVtID0+IHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdSZXN0cmljdEV4cG9ydCcsCiAgICAgICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnQ2hlY2tib3gnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVmFsdWUgPT4gc2NhbGFyIGtleXMgJXskU2VhcmNoRGF0YX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ1JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgUmVzdHJpY3RFeHBvcnRTdHJnID0+ICRSZXN0cmljdEV4cG9ydFN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIGF0dHJpYnV0ZXMKICAgICAgICBteSAkU2VhcmNoQXR0cmlidXRlTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZWFyY2hEYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NUVsZW1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgPT4gJEl0ZW0tPntLZXl9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIHNhdmUgKHNlYXJjaCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmU1JyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIFN1Ym1pdEJhY2sgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBSZWxvYWQgICAgID0+ICdUZW1wbGF0ZUVkaXQ1JywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKCiAgICAgICAgUEFSQU06CiAgICAgICAgZm9yIG15ICRTdWJtaXRLZXkgKCBzb3J0IGtleXMgJVN1Ym1pdCApIHsKICAgICAgICAgICAgbmV4dCBQQVJBTSBpZiAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFN1Ym1pdEtleSApOwoKICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7JFN1Ym1pdEtleX07CiAgICAgICAgICAgIGxhc3QgUEFSQU07CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhbGwgc2VhcmNoIHJlc3RyaWN0aW9ucwogICAgICAgIGlmICggISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXN0cmljdEV4cG9ydCcgKSApIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggZGF0YQogICAgICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPSRTdWJhY3Rpb247VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JFNlYXJjaEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTdWJhY3Rpb24gPSAkU3VibWl0e1JlbG9hZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgc2VhcmNoIGRhdGEKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgU2VhcmNoRGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249JFN1YmFjdGlvbjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVEZWxldGUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZGVsZXRlIHRlbXBsYXRlIGZyb20gZGF0YWJhc2UKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQgaW5mb3JtYXRpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnRJbmZvcm1hdGlvbicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRJbmZvcm1hdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbXBvcnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJbXBvcnQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzb3VyY2UgZmlsZQogICAgICAgIG15ICVTb3VyY2VGaWxlID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtICA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAnU3RyaW5nJywKICAgICAgICApOwoKICAgICAgICAkU291cmNlRmlsZXtDb250ZW50fSB8fD0gJyc7CgogICAgICAgICMgaW1wb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+SW1wb3J0KAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcJFNvdXJjZUZpbGV7Q29udGVudH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLicpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBvdXRwdXQgaW1wb3J0IHJlc3VsdHMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRSZXN1bHR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFsbCByZXR1cm4gY29kZXMgYW5kIGNvbGxlY3QgdGhlIGR1cGxpY2F0ZSBuYW1lcwogICAgICAgIG15IEBEdXBsaWNhdGVOYW1lczsKICAgICAgICBSRVRVUk5DT0RFOgogICAgICAgIGZvciBteSAkUmV0Q29kZSAoIHNvcnQga2V5cyAleyAkUmVzdWx0LT57UmV0Q29kZX0gfSApIHsKCiAgICAgICAgICAgICMganVzdCBnZXQgdGhlIGR1cGxpY2F0ZSBuYW1lCiAgICAgICAgICAgIGlmICggJFJldENvZGUgPX4gbXsgXEEgRHVwbGljYXRlTmFtZSBccysgKC4rKSB9eG1zICkgewogICAgICAgICAgICAgICAgcHVzaCBARHVwbGljYXRlTmFtZXMsICQxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0UmVzdWx0UmV0dXJuQ29kZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGVOYW1lICA9PiAkUmV0Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZUNvdW50ID0+ICRSZXN1bHQtPntSZXRDb2RlfS0+eyRSZXRDb2RlfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgZHVwbGljYXRlIG5hbWVzIGlmIG5lY2Nlc3NhcnkKICAgICAgICBpZiAoQER1cGxpY2F0ZU5hbWVzKSB7CgogICAgICAgICAgICBteSAkRHVwbGljYXRlTmFtZXNTdHJpbmcgPSBqb2luICcsICcsIEBEdXBsaWNhdGVOYW1lczsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW1wb3J0UmVzdWx0RHVwbGljYXRlTmFtZXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRlTmFtZXMgPT4gJER1cGxpY2F0ZU5hbWVzU3RyaW5nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGxhc3QgcHJvY2Vzc2VkIGxpbmUgbXVtYmVyIG9mIGltcG9ydCBmaWxlCiAgICAgICAgaWYgKCAkUmVzdWx0LT57RmFpbGVkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRSZXN1bHRMYXN0TGluZU51bWJlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMYXN0TGluZU51bWJlciA9PiAkUmVzdWx0LT57Q291bnRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdGFydCBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0V4cG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZXhwb3J0IGRhdGEKICAgICAgICBteSAkUmVzdWx0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRGaWxlQ29udGVudCA9IGpvaW4gIlxuIiwgQHsgJFJlc3VsdC0+e0Rlc3RpbmF0aW9uQ29udGVudH0gfTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0V4cG9ydC5jc3YnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9jc3YnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRmlsZUNvbnRlbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKCiAgICAgICAgbXkgJEVtcHR5RGF0YWJhc2UgPSAxOwoKICAgICAgICBDTEFTUzoKICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyAkT2JqZWN0TGlzdC0+eyRhfSBjbXAgJE9iamVjdExpc3QtPnskYn0gfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgdGVtcGxhdGUgbGlzdAogICAgICAgICAgICBteSAkVGVtcGxhdGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3QsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFRlbXBsYXRlTGlzdCB8fCByZWYgJFRlbXBsYXRlTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRUZW1wbGF0ZUxpc3R9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDTEFTUzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEVtcHR5RGF0YWJhc2UgPSAwOwoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRPYmplY3RMaXN0LT57JE9iamVjdH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEICggQHskVGVtcGxhdGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgcm93CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3RSb3cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXROYW1lID0+ICRGb3JtYXRMaXN0LT57ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgPT4gJFZhbGlkTGlzdHsgJFRlbXBsYXRlRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFuIGVtcHR5IGxpc3QKICAgICAgICBpZiAoJEVtcHR5RGF0YWJhc2UpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpc3QKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0xpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIExpc3QnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15ICRDbGFzcyA9ICcgVmFsaWRhdGVfUmVxdWlyZWQgJzsKCiAgICBpZiAoICRTZXJ2ZXJFcnJvcntOYW1lfSApIHsKICAgICAgICAkQ2xhc3MgLj0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQxJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBWYWxpZE9wdGlvblN0cmcgPT4gJFZhbGlkT3B0aW9uU3RyZywKICAgICAgICAgICAgTmFtZUNsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRWRpdE9iamVjdEZvcm1hdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSA9PiAkUGFyYW17T2JqZWN0fSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJFBhcmFte0Zvcm1hdH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtOZXd9ICkgewoKICAgICAgICAjIGdldCBJbXBvcnRFeHBvcnQgb2JqZWN0CiAgICAgICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkQ2xhc3MgPSAnIFZhbGlkYXRlX1JlcXVpcmVkICc7CgogICAgICAgIGlmICggJFNlcnZlckVycm9ye09iamVjdH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17T2JqZWN0fSB8fCAnJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJENsYXNzIC4gJyBNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICRDbGFzcyA9ICcgVmFsaWRhdGVfUmVxdWlyZWQgJzsKICAgICAgICBpZiAoICRTZXJ2ZXJFcnJvcntGb3JtYXR9ICkgewogICAgICAgICAgICAkQ2xhc3MgLj0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0Zvcm1hdH0gfHwgJycsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICRDbGFzcyAuICcgTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTmV3T2JqZWN0Rm9ybWF0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb24gPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb24gPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfTWFza1RlbXBsYXRlRWRpdDIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU2VydmVyRXJyb3I7CiAgICBpZiAoICRQYXJhbXtTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgJVNlcnZlckVycm9yID0gJXsgJFBhcmFte1NlcnZlckVycm9yfSB9OwogICAgfQoKICAgIG15ICVEYXRhVHlwZUVycm9yOwogICAgaWYgKCAkUGFyYW17RGF0YVR5cGVFcnJvcn0gKSB7CiAgICAgICAgJURhdGFUeXBlRXJyb3IgPSAleyAkUGFyYW17RGF0YVR5cGVFcnJvcn0gfTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRUZW1wbGF0ZUlEOwogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFRlbXBsYXRlSUQgPSAkUGFyYW17VGVtcGxhdGVJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZGVkIFRlbXBsYXRlSUQhJyksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgSW1wb3J0RXhwb3J0IG9iamVjdAogICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhOwogICAgJFRlbXBsYXRlRGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQmFja1VSTCcsCiAgICAgICAgVmFsdWUgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDE7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQmFzZUxpbmsnLAogICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnVGVtcGxhdGVPdmVydmlldycsCiAgICAgICAgVmFsdWUgPT4gMSwKICAgICk7CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICMgb3V0cHV0IGxpc3QKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDInLAogICAgICAgIERhdGEgPT4gJFRlbXBsYXRlRGF0YSwKICAgICk7CgogICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIG15ICRPYmplY3RBdHRyaWJ1dGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBqYXZhc2NyaXB0IHZhbGlkYXRpb24gY2xhc3MgcGVyIGRhdGF0eXBlCiAgICBteSAlSlNDbGFzczsKICAgIG15ICVQcmVkZWZpbmVkRXJyb3JNZXNzYWdlczsKCiAgICAkSlNDbGFzc3tOdW1iZXJ9ICAgICAgICAgICAgICAgID0gJ1ZhbGlkYXRlX051bWJlcic7CiAgICAkSlNDbGFzc3tOdW1iZXJCaWdnZXJUaGFuWmVyb30gID0gJ1ZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvJzsKICAgICRKU0NsYXNze0ludGVnZXJ9ICAgICAgICAgICAgICAgPSAnVmFsaWRhdGVfTnVtYmVySW50ZWdlcic7CiAgICAkSlNDbGFzc3tJbnRlZ2VyQmlnZ2VyVGhhblplcm99ID0gJ1ZhbGlkYXRlX051bWJlckludGVnZXJCaWdnZXJUaGFuWmVybyc7CgogICAgJFByZWRlZmluZWRFcnJvck1lc3NhZ2Vze051bWJlcn0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ251bWJlcicpOwogICAgJFByZWRlZmluZWRFcnJvck1lc3NhZ2Vze051bWJlckJpZ2dlclRoYW5aZXJvfQogICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdudW1iZXIgYmlnZ2VyIHRoYW4gemVybycpOwogICAgJFByZWRlZmluZWRFcnJvck1lc3NhZ2Vze0ludGVnZXJ9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdpbnRlZ2VyJyk7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7SW50ZWdlckJpZ2dlclRoYW5aZXJvfQogICAgICAgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nKTsKCiAgICAjIG91dHB1dCBvYmplY3QgYXR0cmlidXRlcwogICAgZm9yIG15ICRJdGVtICggQHskT2JqZWN0QXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgIG15ICRDbGFzcyA9ICcgJzsKICAgICAgICBteSAkVmFsdWU7CgogICAgICAgIG15ICREYXRhVHlwZUVycm9yOwogICAgICAgIG15ICRFcnJvck1lc3NhZ2U7CgogICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAgICAgICAgPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICAgICAkRXJyb3JNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntEYXRhVHlwZX0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAiICRKU0NsYXNzeyAkSXRlbS0+e0lucHV0fS0+e0RhdGFUeXBlfSB9IjsKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcycsCiAgICAgICAgICAgICAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7ICRJdGVtLT57SW5wdXR9LT57RGF0YVR5cGV9IH0KICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBmb3JtIG9yIGZyb20gZGF0YWJhc2UKICAgICAgICAjIFNlcnZlckVycm9yID0gc2hvdyB0aGUgd3JvbmcgZGF0YSBpbiBmb3JtCiAgICAgICAgIyAhU2VydmVyRXJyb3IgPSBzaG93IGRhdGFiYXNlIGRhdGEgb3IgbmV3IGZpZWxkcwoKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2ZXJFcnJvcn0gfHwgJFBhcmFte0RhdGFUeXBlRXJyb3J9ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkUGFyYW17VGVtcGxhdGVEYXRhRm9ybX0tPnsgJEl0ZW0tPntLZXl9IH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmFsdWUgPSAkT2JqZWN0RGF0YS0+eyAkSXRlbS0+e0tleX0gfTsKICAgICAgICB9CgogICAgICAgICMgZXJyb3IgYXJlYQoKICAgICAgICAjIHByZXBhcmUgZGlmZmVyZW50IGRhdGEgJiBtZXNzYWdlIHBlciBlcnJvcgogICAgICAgIGlmICggJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gfHwgJERhdGFUeXBlRXJyb3J7ICRJdGVtLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgJENsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcyAuICcgTW9kZXJuaXplJywKICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgaWQKICAgICAgICBteSAkSUQ7CiAgICAgICAgaWYgKCAkSXRlbS0+e1ByZWZpeH0gKSB7CiAgICAgICAgICAgICRJRCA9ICIkSXRlbS0+e1ByZWZpeH0kSXRlbS0+e0tleX0iOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJElEID0gJEl0ZW0tPntLZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQyRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICBJbnB1dFN0cmcgICAgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgSUQgICAgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkRXJyb3JNZXNzYWdlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0OwoKfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgbXkgJFRlbXBsYXRlSUQ7CiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRQYXJhbXtUZW1wbGF0ZUlEfTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgSW1wb3J0RXhwb3J0IG9iamVjdAogICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhOwogICAgJFRlbXBsYXRlRGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtCYWNrVVJMfSA9ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQyO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAjIG91dHB1dCBsaXN0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzJywKICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZURhdGEsCiAgICApOwoKICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICBteSAkRm9ybWF0QXR0cmlidXRlTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRGb3JtYXREYXRhICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGb3JtYXQgbm90IGZvdW5kIScpLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgb3V0cHV0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICBmb3IgbXkgJEl0ZW0gKCBAeyRGb3JtYXRBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgIyBidWlsZCBpZAogICAgICAgIG15ICRJRDsKICAgICAgICBpZiAoICRJdGVtLT57UHJlZml4fSApIHsKICAgICAgICAgICAgJElEID0gIiRJdGVtLT57UHJlZml4fSRJdGVtLT57S2V5fSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkSUQgPSAiJEl0ZW0tPntLZXl9IjsKICAgICAgICB9CgogICAgICAgIG15ICRDbGFzcyA9ICcgJzsKICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAkQ2xhc3MgPSAnVmFsaWRhdGVfUmVxdWlyZWQgJzsKICAgICAgICB9CgogICAgICAgIGlmICggJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGZvcm0gaW5wdXQKICAgICAgICBteSAkSW5wdXRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnIE1vZGVybml6ZScsCiAgICAgICAgICAgIFZhbHVlID0+ICRGb3JtYXREYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0M0VsZW1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgcmVxdWlyZWQgbm90aWNlCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzRWxlbWVudFJlcXVpcmVkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnQvTGF5b3V0Q2hlY2tib3gucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTGF5b3V0Q2hlY2tib3gucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTY6MDQgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0Q2hlY2tib3g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRDaGVja2JveCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgY2hlY2tib3ggZWxlbWVudHMgaW4gaW1wb3J0L2V4cG9ydC4KCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0Q2hlY2tib3gtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBGb3JtSW5wdXRDcmVhdGUoKQoKQ3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRDaGVja2VkID0gJFBhcmFte1ZhbHVlfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKCiAgICByZXR1cm4KICAgICAgICBxcXs8aW5wdXQgaWQ9IiRQYXJhbXtQcmVmaXh9JFBhcmFte0l0ZW19LT57S2V5fSIgdHlwZT0iY2hlY2tib3giIG5hbWU9IiRQYXJhbXtQcmVmaXh9JFBhcmFte0l0ZW19LT57S2V5fSIgJENoZWNrZWQgLz59Owp9Cgo9aGVhZDIgRm9ybURhdGFHZXQoKQoKR2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKCkxheW91dENoZWNrYm94ClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnQvTGF5b3V0VFQucG0KIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3b3JrIG9mOgojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogTGF5b3V0VFQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTY6MDQgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0VFQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRUVCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheSBDPFRUPiBjb2RlCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnQ6OkxheW91dFRULT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRm9ybUlucHV0Q3JlYXRlKCkKCkNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9Owp9Cgo9aGVhZDIgRm9ybURhdGFHZXQoKQoKR2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnQvTGF5b3V0U2VsZWN0aW9uLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IExheW91dFNlbGVjdGlvbi5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxNjowNCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRTZWxlY3Rpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRTZWxlY3Rpb24gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHNlbGVjdGlvbiBlbGVtZW50cwoKPWN1dAoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRTZWxlY3Rpb24tPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBGb3JtSW5wdXRDcmVhdGUoKQoKQ3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgICAgIENsYXNzICA9PiAnTW9kZXJuaXplJyAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKICAgICRQYXJhbXtWYWx1ZX0gIHx8PSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSAmJiAkUGFyYW17VmFsdWV9ID1+IG17ICMjIyMjIH14bXMgKSB7CiAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0ICcjIyMjIycsICRQYXJhbXtWYWx1ZX07CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9IFxAVmFsdWVzOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3B0aW9uIHN0cmluZwogICAgbXkgJFN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgSUQgICAgICAgICAgID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte0NsYXNzfSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1ByZWZpeH0gLiAkUGFyYW17SXRlbX0tPntLZXl9LAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259LAogICAgICAgIFRyZWVWaWV3ICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUcmVlVmlld30gfHwgMCwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UG9zc2libGVOb25lfSwKICAgICAgICBNdWx0aXBsZSAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TXVsdGlwbGV9LAogICAgICAgIFNpemUgICAgICAgICA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1oZWFkMiBGb3JtRGF0YUdldCgpCgpHZXQgZm9ybSBkYXRhCgogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggPT4gJ1ByZWZpeDo6JywgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBGb3JtRGF0YXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldEFycmF5KAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgbXkgJEZvcm1EYXRhID0gam9pbiAnIyMjIyMnLCBARm9ybURhdGFzOwoKICAgIHJldHVybiAkRm9ybURhdGEgaWYgJEZvcm1EYXRhOwogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAhJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9OwoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT0ZPUksgcHJvamVjdCAoTDxodHRwczovL28tZm9yay5kZS8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JbXBvcnRFeHBvcnQvTGF5b3V0VGV4dC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBMYXlvdXRUZXh0LnBtLHYgMS4xLjEuMSAyMDE4LzEwLzAyIDE1OjE2OjA0IHVkIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnQ6OkxheW91dFRleHQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRUZXh0IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBsYXlvdXQgZnVuY3Rpb25zIGZvciB0ZXh0IGVsZW1lbnRzCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnQ6OkxheW91dFRleHQtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBGb3JtSW5wdXRDcmVhdGUoKQoKQ3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgICA9PiAkSXRlbVJlZiwKICAgICAgICBQcmVmaXggICA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgICAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFJlYWRvbmx5ID0+IDEsICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRQYXJhbXtQcmVmaXh9IHx8PSAnJzsKCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9IHx8ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICBteSAkU2l6ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDQwOwogICAgbXkgJFNpemVDbGFzczsKICAgIGlmICggJFNpemUgPCAxNSApIHsKICAgICAgICAkU2l6ZUNsYXNzID0gJ1cxMHBjJzsKICAgIH0KICAgIGVsc2lmICggJFNpemUgPCAzNSApIHsKICAgICAgICAkU2l6ZUNsYXNzID0gJ1czM3BjJzsKICAgIH0KICAgIGVsc2lmICggJFNpemUgPCA1MCApIHsKICAgICAgICAkU2l6ZUNsYXNzID0gJ1c1MHBjJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzc1cGMnOwogICAgfQoKICAgICMgcHJlcGFyZSBkYXRhCiAgICBteSAkSUQgPSAoICRQYXJhbXtQcmVmaXh9IHx8ICcnICkgLiAoICRQYXJhbXtJdGVtfS0+e0tleX0gKTsKICAgIG15ICROYW1lID0gKCAkUGFyYW17UHJlZml4fSB8fCAnJyApIC4gKCAkUGFyYW17TmFtZX0gfHwgJElEICk7CiAgICBteSAkQ2xhc3MgPSAoICRTaXplQ2xhc3MgfHwgJycgKSAuICggJFBhcmFte0NsYXNzfSB8fCAnJyApOwoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IGlkPVwiJElEXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiJE5hbWVcIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRWYWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAgICAgJFZhbHVlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKICAgIH0KCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICMgYWRkIHJlYWRvbmx5CiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlYWRvbmx5fSApIHsKICAgICAgICAkU3RyaW5nIC49ICdyZWFkb25seT0icmVhZG9ubHkiICc7CiAgICB9CgogICAgJFN0cmluZyAuPSAiLz4gIjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWhlYWQyIEZvcm1EYXRhR2V0KCkKCkdldCBmb3JtIGRhdGEKCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgICMgcmVnZXggY2hlY2sKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVnZXh9ICYmICRGb3JtRGF0YSAhfiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gKSB7CgogICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57SW52YWxpZH0gPSAxOwogICAgICAgIHJldHVybiAkRm9ybURhdGE7CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YSBpZiAkRm9ybURhdGE7CiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICEkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH07CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQvSW1wb3J0RXhwb3J0LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxNjowNCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OjpJbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6SW1wb3J0RXhwb3J0Cgo9Y3V0Cgo9aGVhZDIgSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKCkKClJldHVybnMgYSBpbnB1dCBmaWVsZCBodG1sIHN0cmluZwoKICAgIG15ICRTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgPT4gJEl0ZW1SZWYsCiAgICAgICAgVmFsdWUgPT4gJ1ZhbHVlJywgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJycgaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgbG9va3VwIGl0ZW0gdmFsdWUKICAgIG15ICRTdHJpbmcgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKCVQYXJhbSk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1oZWFkMiBJbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgpCgpSZXR1cm5zIHRoZSB2YWx1ZXMgZnJvbSB0aGUgaHRtbCBmb3JtIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU2VsZi0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRPYmplY3Q7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoJVBhcmFtKTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9Cgo9aGVhZDIgX0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKCkKClRvIGxvYWQgYSBpbXBvcnQvZXhwb3J0IGxheW91dCBiYWNrZW5kIG1vZHVsZQoKICAgIG15ICRCYWNrZW5kID0gJExheW91dE9iamVjdC0+X0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICApOwoKQW4gaW5zdGFuY2Ugb2YgdGhlIGxvYWRlZCBiYWNrZW5kIG1vZHVsZSBpcyByZXR1cm5lZC4KCj1jdXQKCnN1YiBfSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgIGlmICggISRQYXJhbXtUeXBlfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFR5cGUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXQkUGFyYW17VHlwZX0iOwoKICAgICMgbG9hZCB0aGUgYmFja2VuZCBtb2R1bGUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte1R5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoCiAgICAgICAgJXskU2VsZn0sCiAgICAgICAgJVBhcmFtLAogICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICk7CgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UZW1wbGF0ZXMvU3RhbmRhcmQvQWRtaW5JbXBvcnRFeHBvcnQudHQKIyBNb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB3b3JrOgojIENvcHlyaWdodCAoQykgMjAxMC0yMDE5IE9GT1JLLCBodHRwczovL28tZm9yay5kZS8KIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOSBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUvCiMgLS0KIyAkSWQ6IEFkbWluSW1wb3J0RXhwb3J0LnR0LHYgMS4zIDIwMTkvMDYvMDIgMDg6NTU6NDAgdWQgRXhwICQKIyAtLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckZpcnN0Ij4KICAgIDxoMSBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZXF1ZXN0IEZpZWxkIE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIFslIEJyZWFkY3J1bWJQYXRoID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0ZSgnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50JyksCiAgICAgICAgICAgICAgICBMaW5rID0+IEVudigiQWN0aW9uIiksCiAgICAgICAgICAgIH0sCiAgICAgICAgXQogICAgJV0KCiAgICBbJSBTV0lUQ0ggRGF0YS5BY3Rpb24gJV0KICAgICAgICBbJSBDQVNFICdBZGQnICVdCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IFRyYW5zbGF0ZSgiQWRkIEdyb3VwIiksfSkgJV0KICAgICAgICBbJSBDQVNFICdDaGFuZ2UnICVdCiAgICAgICAgICAgIFslIFVTRSBFZGl0VGl0bGUgPSBTdHJpbmcoVHJhbnNsYXRlKCJFZGl0IEdyb3VwIikpICVdCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IEVkaXRUaXRsZS5hcHBlbmQoICc6ICcsIERhdGEuTmFtZSApIH0pICVdCiAgICBbJSBFTkQgJV0KCiAgICBbJSBJTkNMVURFICJCcmVhZGNydW1iLnR0IiBQYXRoID0gQnJlYWRjcnVtYlBhdGggJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+WyUgVHJhbnNsYXRlKCJJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCB0ZW1wbGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJOb3RlIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuT2JqZWN0TmFtZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiTnVtYmVyIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTdGFydCBJbXBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiU3RhcnQgRXhwb3J0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFslIElGIERhdGEuVmFsaWRJRCAhPSAxJV1jbGFzcz0iSW52YWxpZCJbJSBFTkQgJV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQxO1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OdW1iZXIgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5Gb3JtYXROYW1lKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1UZW1wbGF0ZURlbGV0ZTtUZW1wbGF0ZUlEPVslIERhdGEuVGVtcGxhdGVJRCB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgaWQ9IkRlbGV0ZVRlbXBsYXRlSURbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1JbXBvcnRJbmZvcm1hdGlvbjtUZW1wbGF0ZUlEPVslIERhdGEuVGVtcGxhdGVJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSW1wb3J0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RXhwb3J0O1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0MSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZUVkaXQxIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IjEiIC8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5hbWUiPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+Cgo8IS0tIFZhbGlkYXRlX1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJOYW1lIiBjbGFzcz0iWyUgRGF0YS5OYW1lQ2xhc3MgJV0iIHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV3T2JqZWN0Rm9ybWF0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT2JqZWN0Ij5bJSBUcmFuc2xhdGUoIk9iamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PYmplY3RPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik9iamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJPYmplY3QgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPYmplY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiT2JqZWN0IGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZvcm1hdCI+WyUgVHJhbnNsYXRlKCJGb3JtYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRm9ybWF0T3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGb3JtYXRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiRm9ybWF0IGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRm9ybWF0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkZvcm1hdCBpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTmV3T2JqZWN0Rm9ybWF0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdE9iamVjdEZvcm1hdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9iamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBEYXRhLk9iamVjdE5hbWUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iT2JqZWN0IiB2YWx1ZT0iWyUgRGF0YS5PYmplY3QgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIERhdGEuRm9ybWF0TmFtZSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtYXQiIHZhbHVlPSJbJSBEYXRhLkZvcm1hdCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE9iamVjdEZvcm1hdCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj5bJSBUcmFuc2xhdGUoIlZhbGlkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJDb21tZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCI+PHNwYW4+WyUgVHJhbnNsYXRlKCJOZXh0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPSdPdmVydmlldyciPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQxIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDIiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MiIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iMSIgLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPYmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PYmplY3QgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQyRWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuSUQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuSUQgJV1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLkVycm9yTWVzc2FnZSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLklEICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5FcnJvck1lc3NhZ2UpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgIApbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0MkVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkJhY2sgQ2FsbEZvckFjdGlvbiIgdHlwZT0iYnV0dG9uIiBuYW1lPSJCYWNrIiA+PHNwYW4+WyUgVHJhbnNsYXRlKCJCYWNrIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiPjxzcGFuPlslIFRyYW5zbGF0ZSgiTmV4dCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDMiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MyIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iMSIgLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJGb3JtYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gb3JtYXQgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQzRWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuSUQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0M0VsZW1lbnRSZXF1aXJlZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLklEICVdRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuSUQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoImlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIApbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0M0VsZW1lbnRSZXF1aXJlZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0M0VsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkJhY2sgQ2FsbEZvckFjdGlvbiIgdHlwZT0iYnV0dG9uIiBuYW1lPSJCYWNrIiA+PHNwYW4+WyUgVHJhbnNsYXRlKCJCYWNrIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiPjxzcGFuPlslIFRyYW5zbGF0ZSgiTmV4dCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQzIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDQiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWFwSGVhZGVyUm93IFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT2JqZWN0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT2JqZWN0TmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZvcm1hdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZvcm1hdE5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlNCIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNYXBwaW5nQWRkIiB2YWx1ZT0iIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSIiIC8+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NFRhYmxlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciI+WyUgVHJhbnNsYXRlKERhdGEuSGVhZGVyKSB8IGh0bWwgJV08L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NFRhYmxlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NE5vTWFwRm91bmQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSJbJSBEYXRhLkNvbHVtbnMgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIG1hcCBlbGVtZW50cyBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDROb01hcEZvdW5kIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0Q29sdW1uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW5wdXRTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDRDb2x1bW4iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0TWFwTnVtYmVyQ29sdW1uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ291bnRlciAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0TWFwTnVtYmVyQ29sdW1uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDRVcEJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkFycm93VXAidHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nVXA6OlslIERhdGEuTWFwcGluZ0lEIHwgaHRtbCAlXSIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiVXAiKSB8IGh0bWwgJV0iPiBbJSBUcmFuc2xhdGUoIlVwIikgfCBodG1sICVdIDwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NFVwQnV0dG9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NE5vVXBCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJBcnJvd1VwIiB0eXBlPSJzdWJtaXQiIGRpc2FibGVkPSJkaXNhYmxlZCI+IFslIFRyYW5zbGF0ZSgiVXAiKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDROb1VwQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NERvd25CdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJBcnJvd0Rvd24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ0Rvd246OlslIERhdGEuTWFwcGluZ0lEIHwgaHRtbCAlXSIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiRG93biIpIHwgaHRtbCAlXSI+IFslIFRyYW5zbGF0ZSgiRG93biIpIHwgaHRtbCAlXTwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NERvd25CdXR0b24iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0Tm9Eb3duQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dEb3duIiB0eXBlPSJzdWJtaXQiIGRpc2FibGVkPSJkaXNhYmxlZCI+IFslIFRyYW5zbGF0ZSgiRG93biIpIHwgaHRtbCAlXTwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NE5vRG93bkJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iRGVsZXRlQ29sdW1uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNYXBwaW5nRGVsZXRlOjpbJSBEYXRhLk1hcHBpbmdJRCB8IGh0bWwgJV0iIHZhbHVlPSIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NFJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXMTAwcGMgU3BhY2luZ1RvcFNtYWxsIExlZnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiIGlkPSJNYXBwaW5nQWRkQnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdBZGRCdXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkFkZCIpIHwgaHRtbCAlXSI+PHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMtc3F1YXJlIj48L2k+WyUgVHJhbnNsYXRlKCJBZGQgTWFwcGluZyBFbGVtZW50IikgfCBodG1sICVdPC9zcGFuPiA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkJhY2sgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTdWJtaXRCYWNrIiB2YWx1ZT0iU3VibWl0QmFjayI+PHNwYW4+WyUgVHJhbnNsYXRlKCJCYWNrIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0TmV4dEJ1dHRvbiIgaWQ9IlN1Ym1pdE5leHRCdXR0b24iIHZhbHVlPSIxIj48c3Bhbj5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZVNhdmU1IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1Ym1pdE5leHQiIHZhbHVlPSIxIiAvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGUgTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXN0cmljdEV4cG9ydCI+WyUgVHJhbnNsYXRlKCJSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nQm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzdHJpY3RFeHBvcnRTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ1RWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuSUQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgICAKWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDVFbGVtZW50IikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQmFjayBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEJhY2siIHZhbHVlPSJTdWJtaXRCYWNrIj48c3Bhbj5bJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCI+PHNwYW4+WyUgVHJhbnNsYXRlKCJGaW5pc2giKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ICAgICAgICAgICAgClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ1IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydEluZm9ybWF0aW9uIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkltcG9ydCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSW1wb3J0IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTb3VyY2VGaWxlIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU291cmNlRmlsZSI+WyUgVHJhbnNsYXRlKCJTb3VyY2UgRmlsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iU291cmNlRmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN0YXJ0IEltcG9ydCIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTdGFydCBJbXBvcnQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW1wb3J0SW5mb3JtYXRpb24iKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cgo8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbXBvcnRSZXN1bHQiKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFyaWFSb2xlTWFpbiI+CiAgICA8ZGl2IGNsYXNzPSJXNTBwYyBTcGFjaW5nVG9wTGFyZ2UgU3BhY2luZ0JvdHRvbUxhcmdlIENlbnRlckJveCI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkltcG9ydCBzdW1tYXJ5IGZvciAlcyIsIERhdGEuT2JqZWN0KSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJPdmVydmlldyIvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlJlY29yZHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ291bnRlciB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3VjY2VzcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN1Y2Nlc3MgfCBodG1sICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydFJlc3VsdFJldHVybkNvZGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFslIFRyYW5zbGF0ZShEYXRhLlJldHVybkNvZGVOYW1lKSB8IGh0bWwgJV06IFslIERhdGEuUmV0dXJuQ29kZUNvdW50IHwgaHRtbCAlXSkKWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdFJldHVybkNvZGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRmFpbGVkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkZhaWxlZCB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSW1wb3J0UmVzdWx0RHVwbGljYXRlTmFtZXMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJEdXBsaWNhdGUgbmFtZXMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPlslIERhdGEuRHVwbGljYXRlTmFtZXMgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdER1cGxpY2F0ZU5hbWVzIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPlslIERhdGEuTGFzdExpbmVOdW1iZXIgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iQ2VudGVyIFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJPayIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiT2siKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiT2siKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdCIpICVdCg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0LnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEltcG9ydEV4cG9ydC5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxNjowNCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0IC0gaW1wb3J0LCBleHBvcnQgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBpbXBvcnQgYW5kIGV4cG9ydCBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWN1dAoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBUZW1wbGF0ZUxpc3QoKQoKUmV0dXJuIGEgbGlzdCBvZiB0ZW1wbGF0ZXMgYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJFRlbXBsYXRlTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsICAjIChvcHRpb25hbCkKICAgICAgICBGb3JtYXQgPT4gJ0NTVicgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIDE9MSAnOwogICAgbXkgQEJJTkQ7CgogICAgaWYgKCAkUGFyYW17T2JqZWN0fSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgaW1leHBvcnRfb2JqZWN0ID0gPyAnOwogICAgICAgIHB1c2ggQEJJTkQsIFwkUGFyYW17T2JqZWN0fTsKICAgIH0KICAgIGlmICggJFBhcmFte0Zvcm1hdH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGltZXhwb3J0X2Zvcm1hdCA9ID8gJzsKICAgICAgICBwdXNoIEBCSU5ELCBcJFBhcmFte0Zvcm1hdH07CiAgICB9CgogICAgIyBhZGQgb3JkZXIgb3B0aW9uCiAgICAkU1FMIC49ICdPUkRFUiBCWSBpZCc7CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVGVtcGxhdGVMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVGVtcGxhdGVMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQFRlbXBsYXRlTGlzdDsKfQoKPWhlYWQyIFRlbXBsYXRlR2V0KCkKCkdldCBhIGltcG9ydCBleHBvcnQgdGVtcGxhdGUKClJldHVybgogICAgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfQogICAgJFRlbXBsYXRlRGF0YXtOdW1iZXJ9CiAgICAkVGVtcGxhdGVEYXRhe09iamVjdH0KICAgICRUZW1wbGF0ZURhdGF7Rm9ybWF0fQogICAgJFRlbXBsYXRlRGF0YXtOYW1lfQogICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfQogICAgJFRlbXBsYXRlRGF0YXtDb21tZW50fQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVUaW1lfQogICAgJFRlbXBsYXRlRGF0YXtDcmVhdGVCeX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9CgogICAgbXkgJFRlbXBsYXRlRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH0tPnsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0gPSAkUm93WzBdOwogICAgICAgICRUZW1wbGF0ZURhdGF7T2JqZWN0fSAgICAgPSAkUm93WzFdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Rm9ybWF0fSAgICAgPSAkUm93WzJdOwogICAgICAgICRUZW1wbGF0ZURhdGF7TmFtZX0gICAgICAgPSAkUm93WzNdOwogICAgICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0gICAgPSAkUm93WzRdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzVdIHx8ICcnOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9ICAgPSAkUm93WzddOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzhdOwogICAgICAgICRUZW1wbGF0ZURhdGF7Q2hhbmdlQnl9ICAgPSAkUm93WzldOwoKICAgICAgICAkVGVtcGxhdGVEYXRhe051bWJlcn0gPSBzcHJpbnRmICIlMDZkIiwgJFRlbXBsYXRlRGF0YXtUZW1wbGF0ZUlEfTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ID0gXCVUZW1wbGF0ZURhdGE7CgogICAgcmV0dXJuIFwlVGVtcGxhdGVEYXRhOwp9Cgo9aGVhZDIgVGVtcGxhdGVBZGQoKQoKQWRkIGEgbmV3IGltcG9ydC9leHBvcnQgdGVtcGxhdGUKCiAgICBteSAkVGVtcGxhdGVJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgICAgIE9iamVjdCAgPT4gJ1RpY2tldCcsCiAgICAgICAgRm9ybWF0ICA9PiAnQ1NWJywKICAgICAgICBOYW1lICAgID0+ICdUZW1wbGF0ZSBOYW1lJywKICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgQ29tbWVudCA9PiAnQ29tbWVudCcsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGdldCBDaGVja0l0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBGb3JtYXQpKSB7CiAgICAgICAgJENoZWNrSXRlbU9iamVjdC0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRDaGVja0l0ZW1PYmplY3QtPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBleGl0aW5nIHRlbXBsYXRlIHdpdGggc2FtZSBuYW1lCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTm9BZGQgPSAxOwogICAgfQoKICAgICMgYWJvcnQgaW5zZXJ0IG9mIG5ldyB0ZW1wbGF0ZSwgaWYgdGVtcGxhdGUgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCROb0FkZCkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IGFkZCBuZXcgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbnNlcnQgbmV3IHRlbXBsYXRlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF90ZW1wbGF0ZSAnCiAgICAgICAgICAgIC4gJyhpbWV4cG9ydF9vYmplY3QsIGltZXhwb3J0X2Zvcm1hdCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3R9LCBcJFBhcmFte0Zvcm1hdH0sIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgdGVtcGxhdGUKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaW1leHBvcnRfb2JqZWN0ID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtPYmplY3R9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVGVtcGxhdGVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJFRlbXBsYXRlSUQ7Cn0KCj1oZWFkMiBUZW1wbGF0ZVVwZGF0ZSgpCgpVcGRhdGUgYSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBOYW1lICAgICAgID0+ICdUZW1wbGF0ZSBOYW1lJywKICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgQ29tbWVudCAgICA9PiAnQ29tbWVudCcsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIG9iamVjdCBvZiB0aGlzIHRlbXBsYXRlIGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpbWV4cG9ydF9vYmplY3QgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE9iamVjdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRPYmplY3QgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICggISRPYmplY3QgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4gZm91bmQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJE9iamVjdCwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFVwZGF0ZSA9IDE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkVXBkYXRlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFVwZGF0ZSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgdGVtcGxhdGUhIFRlbXBsYXRlIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgb2JqZWN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgdXBkYXRlIHRlbXBsYXRlCiAgICByZXR1cm4gJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBpbWV4cG9ydF90ZW1wbGF0ZSBTRVQgbmFtZSA9ID8sJwogICAgICAgICAgICAuICd2YWxpZF9pZCA9ID8sIGNvbW1lbnRzID0gPywgJwogICAgICAgICAgICAuICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/ICcKICAgICAgICAgICAgLiAnV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIF0sCiAgICApOwp9Cgo9aGVhZDIgVGVtcGxhdGVEZWxldGUoKQoKRGVsZXRlIGV4aXN0aW5nIGltcG9ydC9leHBvcnQgdGVtcGxhdGVzCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBtYXBwaW5nIGRhdGEKICAgIGZvciBteSAkVGVtcGxhdGVJRCAoIEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9ICkgewogICAgICAgICRTZWxmLT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEKICAgICRTZWxmLT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBkYXRhCiAgICAkU2VsZi0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntUZW1wbGF0ZUdldH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGlkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgT2JqZWN0TGlzdCgpCgpSZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBvYmplY3RzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJE9iamVjdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RMaXN0KCk7Cgo9Y3V0CgpzdWIgT2JqZWN0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZwogICAgbXkgJE1vZHVsZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKICAgIHJldHVybiBpZiAhJE1vZHVsZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRNb2R1bGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgb2JqZWN0IGxpc3QKICAgIG15ICRPYmplY3RMaXN0ID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVMaXN0fSApIHsKICAgICAgICAkT2JqZWN0TGlzdC0+eyRNb2R1bGV9ID0gJE1vZHVsZUxpc3QtPnskTW9kdWxlfS0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiAkT2JqZWN0TGlzdDsKfQoKPWhlYWQyIE9iamVjdEF0dHJpYnV0ZXNHZXQoKQoKR2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aGVhZDIgT2JqZWN0RGF0YUdldCgpCgpHZXQgdGhlIG9iamVjdCBkYXRhIGZyb20gYSB0ZW1wbGF0ZQoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfb2JqZWN0IFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlT2JqZWN0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRPYmplY3REYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU9iamVjdERhdGE7Cn0KCj1oZWFkMiBPYmplY3REYXRhU2F2ZSgpCgpTYXZlIHRoZSBvYmplY3QgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIE9iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdPYmplY3REYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBkYXRhCiAgICAkU2VsZi0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtPYmplY3REYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte09iamVjdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSByb3cKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfb2JqZWN0ICcKICAgICAgICAgICAgICAgIC4gJyh0ZW1wbGF0ZV9pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAnCiAgICAgICAgICAgICAgICAuICcoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBPYmplY3REYXRhRGVsZXRlKCkKCkRlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRUZW1wbGF0ZUlEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9vYmplY3QgV0hFUkUgdGVtcGxhdGVfaWQgSU4gKCAkVGVtcGxhdGVJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1oZWFkMiBGb3JtYXRMaXN0KCkKClJldHVybiBhIGxpc3Qgb2YgYXZhaWxhYmxlIGZvcm1hdHMgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCj1jdXQKCnN1YiBGb3JtYXRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnCiAgICBteSAkTW9kdWxlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJyk7CgogICAgcmV0dXJuIGlmICEkTW9kdWxlTGlzdDsKICAgIHJldHVybiBpZiByZWYgJE1vZHVsZUxpc3QgbmUgJ0hBU0gnOwoKICAgICMgY3JlYXRlIHRoZSBmb3JtYXQgbGlzdAogICAgbXkgJEZvcm1hdExpc3QgPSB7fTsKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JE1vZHVsZUxpc3R9ICkgewogICAgICAgICRGb3JtYXRMaXN0LT57JE1vZHVsZX0gPSAkTW9kdWxlTGlzdC0+eyRNb2R1bGV9LT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRGb3JtYXRMaXN0Owp9Cgo9aGVhZDIgRm9ybWF0QXR0cmlidXRlc0dldCgpCgpHZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGZvcm1hdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIEZvcm1hdERhdGFHZXQoKQoKR2V0IHRoZSBmb3JtYXQgZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkRm9ybWF0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X2Zvcm1hdCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUZvcm1hdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRm9ybWF0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtYXREYXRhOwp9Cgo9aGVhZDIgRm9ybWF0RGF0YVNhdmUoKQoKU2F2ZSB0aGUgZm9ybWF0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBGb3JtYXREYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnRm9ybWF0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBmb3JtYXQgZGF0YQogICAgJFNlbGYtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17Rm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtGb3JtYXREYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X2Zvcm1hdCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRm9ybWF0RGF0YURlbGV0ZSgpCgpEZWxldGUgdGhlIGV4aXN0aW5nIGZvcm1hdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfZm9ybWF0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgTWFwcGluZ0xpc3QoKQoKUmV0dXJuIGEgbGlzdCBvZiBtYXBwaW5nIGRhdGEgaWRzIHNvcnRlZCBieSBwb3NpdGlvbiBhcyBhcnJheSByZWZlcmVuY2UKCiAgICBteSAkTWFwcGluZ0xpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gT1JERVIgQlkgcG9zaXRpb24nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQE1hcHBpbmdMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATWFwcGluZ0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIFxATWFwcGluZ0xpc3Q7Cn0KCj1oZWFkMiBNYXBwaW5nQWRkKCkKCkFkZCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CgogICAgbXkgJE1hcHBpbmdJRCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdBZGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBtYXhpbXVtIHBvc2l0aW9uCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBtYXgocG9zaXRpb24pIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5ld1Bvc2l0aW9uID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBpZiAoIGRlZmluZWQgJFJvd1swXSApIHsKICAgICAgICAgICAgJE5ld1Bvc2l0aW9uID0gJFJvd1swXTsKICAgICAgICAgICAgJE5ld1Bvc2l0aW9uKys7CiAgICAgICAgfQogICAgfQoKICAgICMgaW5zZXJ0IGEgbmV3IG1hcHBpbmcgZGF0YSByb3cKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nICh0ZW1wbGF0ZV9pZCwgcG9zaXRpb24pIFZBTFVFUyAoPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJE5ld1Bvc2l0aW9uIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgbWFwcGluZyBkYXRhIHJvdwogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPyBBTkQgcG9zaXRpb24gPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkTmV3UG9zaXRpb24gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRNYXBwaW5nSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0lEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJE1hcHBpbmdJRDsKfQoKPWhlYWQyIE1hcHBpbmdEZWxldGUoKQoKRGVsZXRlIGV4aXN0aW5nIG1hcHBpbmcgZGF0YSByb3dzCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCAgPT4gMTIzLAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17TWFwcGluZ0lEfSApIHsKCiAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgb25lIG1hcHBpbmcgcm93CiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWJ1aWxkIG1hcHBpbmcgcG9zaXRpb25zCiAgICAgICAgJFNlbGYtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAxOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAgICAgICAgICRTZWxmLT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFsbCBtYXBwaW5nIHJvd3Mgb2YgdGhpcyB0ZW1wbGF0ZQogICAgICAgIHJldHVybiAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIHRlbXBsYXRlX2lkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgKTsKICAgIH0KfQoKPWhlYWQyIE1hcHBpbmdVcCgpCgpNb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgdXAKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdVcCgKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdVcCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bMF07CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhJFBvc2l0aW9uOwoKICAgIG15ICRQb3NpdGlvblVwcGVyID0gJFBvc2l0aW9uIC0gMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25VcHBlciBdLAogICAgKTsKICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uVXBwZXIsIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE1hcHBpbmdEb3duKCkKCk1vdmUgYW4gbWFwcGluZyBkYXRhIHJvdyBkb3duCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRG93bigKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdEb3duIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbWFwcGluZyBkYXRhIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkUGFyYW17TWFwcGluZ0lEfSA9PSAkTWFwcGluZ0xpc3QtPlstMV07CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBwb3NpdGlvbiBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFBvc2l0aW9uOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKCiAgICAjIHVwZGF0ZSBwb3NpdGlvbnMKICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb24sIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkUG9zaXRpb25Eb3duIF0sCiAgICApOwogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdVUERBVEUgaW1leHBvcnRfbWFwcGluZyBTRVQgcG9zaXRpb24gPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUG9zaXRpb25Eb3duLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkKCkKClJlYnVpbGQgdGhlIHBvc2l0aW9ucyBvZiBhIG1hcHBpbmcgbGlzdAoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdQb3NpdGlvblJlYnVpbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyB1cGRhdGUgcG9zaXRpb24KICAgIG15ICRDb3VudGVyID0gMDsKICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDb3VudGVyLCBcJE1hcHBpbmdJRCBdLAogICAgICAgICk7CiAgICAgICAgJENvdW50ZXIrKzsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1oZWFkMiBNYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgpCgpEZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17TWFwcGluZ0lEfSApIHsKICAgICAgICAkUGFyYW17TWFwcGluZ0lEfSA9IFsgJFBhcmFte01hcHBpbmdJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtNYXBwaW5nSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0lEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJE1hcHBpbmdJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgY3JlYXRlIGFuZCBhZGQgYmluZCBwYXJhbWV0ZXJzCiAgICBteSBAQklORCA9IG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBkZWxldGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkIElOICggJE1hcHBpbmdJRFN0cmluZyApIiwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7Cn0KCj1oZWFkMiBNYXBwaW5nT2JqZWN0RGF0YVNhdmUoKQoKU2F2ZSB0aGUgb2JqZWN0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gMTIzLAogICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+ICRIYXNoUmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBNYXBwaW5nT2JqZWN0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9IG5lICdIQVNIJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nT2JqZWN0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgbWFwcGluZyBkYXRhCiAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+ICRQYXJhbXtNYXBwaW5nSUR9LAogICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17TWFwcGluZ09iamVjdERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhVmFsdWU7CgogICAgICAgICMgaW5zZXJ0IG9uZSBtYXBwaW5nIG9iamVjdCByb3cKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgJwogICAgICAgICAgICAgICAgLiAnKG1hcHBpbmdfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSwgXCREYXRhS2V5LCBcJERhdGFWYWx1ZSBdLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nT2JqZWN0RGF0YUdldCgpCgpHZXQgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRPYmplY3REYXRhUmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgTWFwcGluZ0lEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X21hcHBpbmdfb2JqZWN0IFdIRVJFIG1hcHBpbmdfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU1hcHBpbmdPYmplY3REYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdPYmplY3REYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgIHJldHVybiBcJU1hcHBpbmdPYmplY3REYXRhOwp9Cgo9aGVhZDIgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKR2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGZvcm1hdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fQogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBmb3JtYXQKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aGVhZDIgTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRNYXBwaW5nSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgbWFwcGluZ19pZCBJTiAoICRNYXBwaW5nSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgTWFwcGluZ0Zvcm1hdERhdGFTYXZlKCkKClNhdmUgdGhlIGZvcm1hdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nRm9ybWF0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgTWFwcGluZ0Zvcm1hdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ0Zvcm1hdERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte01hcHBpbmdGb3JtYXREYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgbWFwcGluZyBmb3JtYXQgcm93CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0ICcKICAgICAgICAgICAgICAgIC4gJyhtYXBwaW5nX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgTWFwcGluZ0Zvcm1hdERhdGFHZXQoKQoKR2V0IHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhR2V0KAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdGb3JtYXREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCBXSEVSRSBtYXBwaW5nX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVNYXBwaW5nRm9ybWF0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nRm9ybWF0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVNYXBwaW5nRm9ybWF0RGF0YTsKfQoKPWhlYWQyIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKR2V0IHRoZSBzZWFyY2ggYXR0cmlidXRlcyBvZiBhIG9iamVjdCBiYWNrZW5kIGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoQXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBzZWFyY2ggYXR0cmlidXRlIGxpc3Qgb2YgYW4gb2JqZWN0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIFNlYXJjaERhdGFHZXQoKQoKR2V0IHRoZSBzZWFyY2ggZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkU2VhcmNoRGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVNlYXJjaERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VhcmNoRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVTZWFyY2hEYXRhOwp9Cgo9aGVhZDIgU2VhcmNoRGF0YVNhdmUoKQoKU2F2ZSB0aGUgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgU2VhcmNoRGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBTZWFyY2hEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtTZWFyY2hEYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU2VhcmNoRGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBzZWFyY2ggZGF0YQogICAgJFNlbGYtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17U2VhcmNoRGF0YX0gfSApIHsKCiAgICAgICAgIyBxdW90ZQogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17U2VhcmNoRGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhJERhdGFLZXk7CiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICEkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X3NlYXJjaCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VhcmNoRGF0YURlbGV0ZSgpCgpEZWxldGUgdGhlIGV4aXN0aW5nIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfc2VhcmNoIFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgRXhwb3J0KCkKCkV4cG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCnJldHVybnMgc29tZXRoaW5nIGxpa2UKCiAgICAkUmVzdWx0UmVmID0gewogICAgICAgIFN1Y2Nlc3MgICA9PiAyLAogICAgICAgIEZhaWxlZCAgICA9PiAwLAogICAgICAgIERlc3RpbmF0aW9uQ29udGVudCA9PiBbCiAgICAgICAgICAgIFsgJ0F0dHJfMWEnLCAnQXR0cl8xYicsICdBdHRyXzFjJywgXSwKICAgICAgICAgICAgWyAnQXR0cl8yYScsICdBdHRyXzJiJywgJ0F0dHJfM2MnLCBdLAogICAgICAgIF0sCiAgICB9OwoKPWN1dAoKc3ViIEV4cG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kCiAgICBteSAkT2JqZWN0QmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fQogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkRm9ybWF0QmFja2VuZDsKCiAgICAjIGdldCBleHBvcnQgZGF0YQogICAgbXkgJEV4cG9ydERhdGEgPSAkT2JqZWN0QmFja2VuZC0+RXhwb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgbXkgJEZvcm1hdERhdGEgPSAkU2VsZi0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGlmIGNvbHVtbiBoZWFkZXJzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZXhwb3J0CiAgICBpZiAoICRGb3JtYXREYXRhLT57SW5jbHVkZUNvbHVtbkhlYWRlcnN9ICkgewoKICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcyAodGhlIG5hbWUgb2YgdGhlIGNvbHVtbnMpCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJFNlbGYtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGxvb2t1cCBoYXNoIGZvciB0aGUgb2JqZWN0IGF0dHJpYnV0ZSBuYW1lcwogICAgICAgIG15ICVBdHRyaWJ1dGVMb29rdXAgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0gfSBAeyAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMtPlswXS0+e0lucHV0fS0+e0RhdGF9IH07CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWVzCiAgICAgICAgbXkgQENvbHVtbk5hbWVzOwogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjb2x1bW4gbmFtZQogICAgICAgICAgICBteSAkQ29sdW1uTmFtZSA9ICRBdHRyaWJ1dGVMb29rdXB7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfTsKCiAgICAgICAgICAgIHB1c2ggQENvbHVtbk5hbWVzLCAkQ29sdW1uTmFtZTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGNvbHVtbiBoZWFkZXJzIGFzIGZpcnN0IHJvdwogICAgICAgIHVuc2hpZnQgQHskRXhwb3J0RGF0YX0sIFxAQ29sdW1uTmFtZXM7CiAgICB9CgogICAgbXkgJVJlc3VsdCA9ICgKICAgICAgICBTdWNjZXNzICAgICAgICAgICAgPT4gMCwKICAgICAgICBGYWlsZWQgICAgICAgICAgICAgPT4gMCwKICAgICAgICBEZXN0aW5hdGlvbkNvbnRlbnQgPT4gW10sCiAgICApOwoKICAgIEVYUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEV4cG9ydERhdGFSb3cgKCBAeyRFeHBvcnREYXRhfSApIHsKCiAgICAgICAgIyBleHBvcnQgb25lIHJvdwogICAgICAgIG15ICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgPSAkRm9ybWF0QmFja2VuZC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRFeHBvcnREYXRhUm93LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIWRlZmluZWQgJERlc3RpbmF0aW9uQ29udGVudFJvdyApIHsKICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgICAgIG5leHQgRVhQT1JUREFUQVJPVzsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJvdyB0byBkZXN0aW5hdGlvbiBjb250ZW50CiAgICAgICAgcHVzaCBAeyAkUmVzdWx0e0Rlc3RpbmF0aW9uQ29udGVudH0gfSwgJERlc3RpbmF0aW9uQ29udGVudFJvdzsKICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e0ZhaWxlZH0gcmVjb3JkcyAoJFRlbXBsYXRlRGF0YS0+e09iamVjdH0pOiBmYWlsZWQhIiwKICAgICk7CiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSAgPT4gIkV4cG9ydCBvZiAkUmVzdWx0e1N1Y2Nlc3N9IHJlY29yZHMgKCRUZW1wbGF0ZURhdGEtPntPYmplY3R9KTogc3VjY2Vzc2Z1bCEiLAogICAgKTsKCiAgICByZXR1cm4gXCVSZXN1bHQ7Cn0KCj1oZWFkMiBJbXBvcnQoKQoKSW1wb3J0IGZ1bmN0aW9uCgogICAgbXkgJFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkltcG9ydCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgRGlzYWJsZSB0aGUgY2FjaGUgZm9yIGZhc3RlciBpbXBvcnQuCiAgICAkQ2FjaGVPYmplY3QtPkNvbmZpZ3VyZSgKICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAwLAogICAgICAgIENhY2hlSW5CYWNrZW5kID0+IDAsCiAgICApOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntPYmplY3R9IHx8ICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIG9iamVjdCBiYWNrZW5kCiAgICBteSAkT2JqZWN0QmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fQogICAgKTsKCiAgICByZXR1cm4gaWYgISRPYmplY3RCYWNrZW5kOwoKICAgICMgbG9hZCBmb3JtYXQgYmFja2VuZAogICAgbXkgJEZvcm1hdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkRm9ybWF0QmFja2VuZDsKCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZC0+SW1wb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRQYXJhbXtTb3VyY2VDb250ZW50fSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRJbXBvcnREYXRhOwoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRTZWxmLT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgaWYgY29sdW1uIGhlYWRlcnMgYXJlIGFjdGl2YXRlZCwgdGhlIGZpcnN0IHJvdyBtdXN0IGJlIHJlbW92ZWQKICAgIGlmICggJEZvcm1hdERhdGEtPntJbmNsdWRlQ29sdW1uSGVhZGVyc30gKSB7CiAgICAgICAgc2hpZnQgQHskSW1wb3J0RGF0YX07CiAgICB9CgogICAgIyBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IGFuZCBub3Qgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkIHJvd3MKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgT2JqZWN0ICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgRmFpbGVkICA9PiAwLAogICAgICAgIFJldENvZGUgPT4ge30sCiAgICAgICAgQ291bnRlciA9PiAwLAogICAgKTsKICAgIElNUE9SVERBVEFST1c6CiAgICBmb3IgbXkgJEltcG9ydERhdGFSb3cgKCBAeyRJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFJlc3VsdHtDb3VudGVyfSsrOwoKICAgICAgICAjIGltcG9ydCBhIHNpbmdsZSByb3cKICAgICAgICBteSAoICRJRCwgJFJldENvZGUgKSA9ICRPYmplY3RCYWNrZW5kLT5JbXBvcnREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEltcG9ydERhdGFSb3csCiAgICAgICAgICAgIENvdW50ZXIgICAgICAgPT4gJFJlc3VsdHtDb3VudGVyfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkSUQgKSB7CgogICAgICAgICAgICAjIGNvdW50IER1cGxpY2F0ZU5hbWUgZW50cmllcyBhcyBlcnJvcnMKICAgICAgICAgICAgaWYgKCAkUmV0Q29kZSAmJiAkUmV0Q29kZSA9fiBteyBcQSBEdXBsaWNhdGVOYW1lIH14bXMgKSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0e1JldENvZGV9LT57JFJldENvZGV9Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJlc3VsdHtGYWlsZWR9Kys7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmVzdWx0e1JldENvZGV9LT57JFJldENvZGV9Kys7CiAgICAgICAgICAgICRSZXN1bHR7U3VjY2Vzc30rKzsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2cgcmVzdWx0CiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHR7Q291bnRlcn0gJFJlc3VsdHtPYmplY3R9IHJlY29yZHM6ICIKICAgICAgICAgICAgLiAiJFJlc3VsdHtGYWlsZWR9IGZhaWxlZCwgJFJlc3VsdHtTdWNjZXNzfSBzdWNjZWVkZWQiLAogICAgKTsKICAgIGZvciBteSAkUmV0Q29kZSAoIHNvcnQga2V5cyAleyAkUmVzdWx0e1JldENvZGV9IH0gKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFJlc3VsdHtSZXRDb2RlfS0+eyRSZXRDb2RlfSB8fCAwOwogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJJbXBvcnQgb2YgJFJlc3VsdHtDb3VudGVyfSAkUmVzdWx0e09iamVjdH0gcmVjb3JkczogJENvdW50ICRSZXRDb2RlIiwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUmVzdWx0e0ZhaWxlZH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlOiAkUmVzdWx0e0NvdW50ZXJ9IiwKICAgICAgICApOwogICAgfQoKICAgICMgQ2xlYW51cCB0aGUgY2FjaGUgYWZ0ZXIgaW1wb3J0LgogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9GT1JLIHByb2plY3QgKEw8aHR0cHM6Ly9vLWZvcmsuZGUvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiMgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgd29yazoKIyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKIyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgd29yayBvZjoKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IENTVi5wbSx2IDEuMS4xLjEgMjAxOC8xMC8wMiAxNToxNjowNCB1ZCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTViAtIGltcG9ydC9leHBvcnQgYmFja2VuZCBmb3IgQ1NWCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBmdW5jdGlvbnMgdG8gaW1wb3J0IGFuZCBleHBvcnQgYSBjc3YgZm9ybWF0Cgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRJbXBvcnRFeHBvcnRDU1ZCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJ1RleHQ6OkNTVicpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ1BBTiBtb2R1bGUgVGV4dDo6Q1NWIGlzIHJlcXVpcmVkIHRvIHVzZSB0aGUgQ1NWIGltcG9ydC9leHBvcnQgbW9kdWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWZpbmUgYXZhaWxhYmxlIHNlcGFyYXRvcnMKICAgICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30gPSB7CiAgICAgICAgVGFidWxhdG9yID0+ICJcdCIsCiAgICAgICAgU2VtaWNvbG9uID0+ICc7JywKICAgICAgICBDb2xvbiAgICAgPT4gJzonLAogICAgICAgIERvdCAgICAgICA9PiAnLicsCiAgICAgICAgQ29tbWEgICAgID0+ICcsJywKICAgIH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRm9ybWF0QXR0cmlidXRlc0dldCgpCgpHZXQgdGhlIGZvcm1hdCBhdHRyaWJ1dGVzIG9mIGEgZm9ybWF0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZXMgPSAkRm9ybWF0QmFja2VuZC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnQ29sdW1uU2VwYXJhdG9yJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdDb2x1bW4gU2VwYXJhdG9yJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gVHJhbnNsYXRhYmxlKCdUYWJ1bGF0b3IgKFRBQiknKSwKICAgICAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gVHJhbnNsYXRhYmxlKCdTZW1pY29sb24gKDspJyksCiAgICAgICAgICAgICAgICAgICAgQ29sb24gICAgID0+IFRyYW5zbGF0YWJsZSgnQ29sb24gKDopJyksCiAgICAgICAgICAgICAgICAgICAgRG90ICAgICAgID0+IFRyYW5zbGF0YWJsZSgnRG90ICguKScpLAogICAgICAgICAgICAgICAgICAgIENvbW1hICAgICA9PiBUcmFuc2xhdGFibGUoJ0NvbW1hICgsKScpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NoYXJzZXQnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0NoYXJzZXQnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAnVVRGLTgnLAogICAgICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIE1heExlbmd0aCAgICA9PiAyMCwKICAgICAgICAgICAgICAgIFJlYWRvbmx5ICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnSW5jbHVkZUNvbHVtbkhlYWRlcnMnLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnKSwKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIDAgPT4gVHJhbnNsYXRhYmxlKCdObycpLAogICAgICAgICAgICAgICAgICAgIDEgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgbWFwcGluZyBhdHRyaWJ1dGVzIG9mIGFuIGZvcm1hdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEZvcm1hdEJhY2tlbmQtPk1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvbHVtbicsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnQ29sdW1uJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdUVCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFJlcXVpcmVkID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aGVhZDIgSW1wb3J0RGF0YUdldCgpCgpHZXQgaW1wb3J0IGRhdGEgYXMgQzwyRC1hcnJheT4gcmVmZXJlbmNlCgogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZC0+SW1wb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTdHJpbmdSZWYsICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBbXSBpZiAhZGVmaW5lZCAkUGFyYW17U291cmNlQ29udGVudH07CgogICAgIyBjaGVjayBzb3VyY2UgY29udGVudAogICAgaWYgKCByZWYgJFBhcmFte1NvdXJjZUNvbnRlbnR9IG5lICdTQ0FMQVInICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnU291cmNlQ29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9ybWF0IGRhdGEKICAgIGlmICggISRGb3JtYXREYXRhIHx8IHJlZiAkRm9ybWF0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBmb3JtYXQgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY2hhcnNldAogICAgbXkgJENoYXJzZXQgPSAkRm9ybWF0RGF0YS0+e0NoYXJzZXR9IHx8PSAnJzsKCiAgICAjIGNoZWNrIHRoZSBjaGFyc2V0CiAgICBpZiAoICRDaGFyc2V0IG5lICdVVEYtOCcgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgY2hhcnNldCBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfS4gQ2hhcnNldCBtdXN0IGJlIFVURi04ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc2VwYXJhdG9yCiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgIyBjcmVhdGUgYW4gaW4gbWVtb3J5IHRlbXAgZmlsZSBhbmQgb3BlbiBpdAogICAgbXkgJEZpbGVDb250ZW50ID0gJyc7CiAgICBvcGVuIG15ICRGSCwgJys8JywgXCRGaWxlQ29udGVudDsgICAgIyMgbm8gY3JpdGljCgogICAgIyB3cml0ZSBzb3VyY2UgY29udGVudAogICAgcHJpbnQgJEZIICR7ICRQYXJhbXtTb3VyY2VDb250ZW50fSB9OwoKICAgICMgcmV3aW5kIGZpbGUgaGFuZGxlCiAgICBzZWVrICRGSCwgMCwgMDsKCiAgICAjIHBhcnNlIHRoZSBjb250ZW50CiAgICBteSAkTGluZUNvdW50ID0gMTsKICAgIG15IEBJbXBvcnREYXRhOwoKICAgIHdoaWxlICggIWVvZigkRkgpICkgewogICAgICAgIG15ICRDb2x1bW4gPSAkUGFyc2VPYmplY3QtPmdldGxpbmUoJEZIKTsKICAgICAgICBwdXNoIEBJbXBvcnREYXRhLCAkQ29sdW1uOwogICAgICAgICRMaW5lQ291bnQrKzsKICAgIH0KCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBteSAoICRQYXJzZUVycm9yQ29kZSwgJFBhcnNlRXJyb3JTdHJpbmcgKSA9ICRQYXJzZU9iamVjdC0+ZXJyb3JfZGlhZygpOwogICAgaWYgKCRQYXJzZUVycm9yQ29kZSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RXJyb3IgYXQgbGluZSAkTGluZUNvdW50LCAiCiAgICAgICAgICAgICAgICAuICJFcnJvckNvZGU6ICRQYXJzZUVycm9yQ29kZSAnJFBhcnNlRXJyb3JTdHJpbmcnICIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNsb3NlIHRoZSBpbiBtZW1vcnkgZmlsZSBoYW5kbGUKICAgIGNsb3NlICRGSDsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIGZvciBteSAkUm93IChASW1wb3J0RGF0YSkgewogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JFJvd30gKSB7CiAgICAgICAgICAgIEVuY29kZTo6X3V0Zjhfb24oJENlbGwpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBJbXBvcnREYXRhOwp9Cgo9aGVhZDIgRXhwb3J0RGF0YVNhdmUoKQoKRXhwb3J0IG9uZSByb3cgb2YgdGhlIGV4cG9ydCBkYXRhCgogICAgbXkgJERlc3RpbmF0aW9uQ29udGVudCA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRXhwb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZXhwb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17RXhwb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0V4cG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAkQ2hhcnNldCBuZSAnVVRGLTgnICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNoYXJzZXQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0uIENoYXJzZXQgbXVzdCBiZSBVVEYtOCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbHVtbm4gc2VwYXJhdG9yCiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgaWYgKCAhJFBhcnNlT2JqZWN0LT5jb21iaW5lKCBAeyAkUGFyYW17RXhwb3J0RGF0YVJvd30gfSApICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbWJpbmUgdGhlIGV4cG9ydCBkYXRhIHRvIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIENTViBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkUGFyc2VPYmplY3QtPnN0cmluZygpOwoKICAgICMgc2V0IHV0ZjggZmxhZwogICAgRW5jb2RlOjpfdXRmOF9vbigkU3RyaW5nKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ29uc29sZS9Db21tYW5kL0FkbWluL0lUU00vSW1wb3J0RXhwb3J0L0ltcG9ydC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBJbXBvcnQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTY6MDQgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpJbXBvcnRFeHBvcnQ6OkltcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ1RoZSB0b29sIGZvciBpbXBvcnRpbmcgY29uZmlnIGl0ZW1zJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0ZW1wbGF0ZS1udW1iZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJTcGVjaWZ5IGEgdGVtcGxhdGUgbnVtYmVyIHRvIGJlIGltcG9lcnRlZC4iLAogICAgICAgIFJlcXVpcmVkICAgID0+IDEsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci9cZCsvc214LAogICAgKTsKICAgICRTZWxmLT5BZGRBcmd1bWVudCgKICAgICAgICBOYW1lICAgICAgICA9PiAnc291cmNlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgZmlsZSB3aGljaCBjb250YWluaW5nIHRoZSBjb25maWcgaXRlbSBkYXRhIGZvciBpbXBvcnRpbmcuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNvdXJjZVBhdGggPSAkU2VsZi0+R2V0QXJndW1lbnQoJ3NvdXJjZScpOwogICAgaWYgKCAkU291cmNlUGF0aCAmJiAhLXIgJFNvdXJjZVBhdGggKSB7CiAgICAgICAgZGllICJGaWxlICRTb3VyY2VQYXRoIGRvZXMgbm90IGV4aXN0LCBjYW4gbm90IGJlIHJlYWQuXG4iOwogICAgfQoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPkdldE9wdGlvbigndGVtcGxhdGUtbnVtYmVyJyk7CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiVGVtcGxhdGUgJFRlbXBsYXRlSUQgbm90IGZvdW5kIS5cbiIpOwogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJFeHBvcnQgYWJvcnRlZC4uXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+SW1wb3J0aW5nIGNvbmZpZyBpdGVtcy4uLjwveWVsbG93PlxuIik7CiAgICAkU2VsZi0+UHJpbnQoICI8eWVsbG93PiIgLiAoICc9JyB4IDY5ICkgLiAiPC95ZWxsb3c+XG4iICk7CgogICAgbXkgJFNvdXJjZUNvbnRlbnQ7CiAgICBteSAkU291cmNlRmlsZSA9ICRTZWxmLT5HZXRBcmd1bWVudCgnc291cmNlJyk7CgogICAgaWYgKCRTb3VyY2VGaWxlKSB7CgogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5SZWFkIEZpbGUgJFNvdXJjZUZpbGUuPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgJFNvdXJjZUNvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNvdXJjZUZpbGUsCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFNvdXJjZUNvbnRlbnQgKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJDYW4ndCByZWFkIGZpbGUgJFNvdXJjZUZpbGUuXG5JbXBvcnQgYWJvcnRlZC5cbiIpIGlmICEkU291cmNlQ29udGVudDsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIGltcG9ydCBkYXRhCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5JbXBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTb3VyY2VDb250ZW50LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgogICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiXG5FcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSB0aGUgT0ZPUksgbG9nIGZvciBkZXRhaWxzLlxuIik7CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICB9CgogICAgIyBwcmludCByZXN1bHQKICAgICRTZWxmLT5QcmludCgiXG48Z3JlZW4+SW1wb3J0IG9mICRSZXN1bHQtPntDb3VudGVyfSAkUmVzdWx0LT57T2JqZWN0fSByZWNvcmRzOjwvZ3JlZW4+XG4iKTsKICAgICRTZWxmLT5QcmludCggIjxncmVlbj4iIC4gKCAnLScgeCA2OSApIC4gIjwvZ3JlZW4+XG4iICk7CiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5TdWNjZXNzOiAkUmVzdWx0LT57U3VjY2Vzc30gc3VjY2VlZGVkPC9ncmVlbj5cbiIpOwogICAgaWYgKCAkUmVzdWx0LT57RmFpbGVkfSApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiJFJlc3VsdC0+e0ZhaWxlZH0gZmFpbGVkLlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5FcnJvcjogJFJlc3VsdC0+e0ZhaWxlZH0gZmFpbGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICBmb3IgbXkgJFJldENvZGUgKCBzb3J0IGtleXMgJXsgJFJlc3VsdC0+e1JldENvZGV9IH0gKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFJlc3VsdC0+e1JldENvZGV9LT57JFJldENvZGV9IHx8IDA7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+SW1wb3J0IG9mICRSZXN1bHQtPntDb3VudGVyfSAkUmVzdWx0LT57T2JqZWN0fSByZWNvcmRzOiAkQ291bnQgJFJldENvZGU8L2dyZWVuPlxuIik7CiAgICB9CiAgICBpZiAoICRSZXN1bHQtPntGYWlsZWR9ICkgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkxhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlOiAkUmVzdWx0LT57Q291bnRlcn08L2dyZWVuPlxuIik7CiAgICB9CgogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+SW1wb3J0IGNvbXBsZXRlLjwvZ3JlZW4+XG4iKTsKICAgICRTZWxmLT5QcmludCggIjxncmVlbj4iIC4gKCAnLScgeCA2OSApIC4gIjwvZ3JlZW4+XG4iICk7CiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKCiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ29uc29sZS9Db21tYW5kL0FkbWluL0lUU00vSW1wb3J0RXhwb3J0L0V4cG9ydC5wbQojIE1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHdvcms6CiMgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTggT0ZPUkssIGh0dHBzOi8vby1mb3JrLmRlCiMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHdvcmsgb2Y6CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBFeHBvcnQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTY6MDQgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpJbXBvcnRFeHBvcnQ6OkV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ1RoZSB0b29sIGZvciBleHBvcnRpbmcgY29uZmlnIGl0ZW1zJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0ZW1wbGF0ZS1udW1iZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJTcGVjaWZ5IGEgdGVtcGxhdGUgbnVtYmVyIHRvIGJlIGV4cG9ydGVkLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyL1xkKy9zbXgsCiAgICApOwogICAgJFNlbGYtPkFkZEFyZ3VtZW50KAogICAgICAgIE5hbWUgICAgICAgID0+ICdkZXN0aW5hdGlvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNwZWNpZnkgdGhlIHBhdGggdG8gYSBmaWxlIHdoZXJlIGNvbmZpZyBpdGVtIGRhdGEgc2hvdWxkIGJlIGV4cG9ydGVkLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8uKi9zbXgsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPkdldE9wdGlvbigndGVtcGxhdGUtbnVtYmVyJyk7CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiVGVtcGxhdGUgJFRlbXBsYXRlSUQgbm90IGZvdW5kIS5cbiIpOwogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJFeHBvcnQgYWJvcnRlZC4uXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+RXhwb3J0aW5nIGNvbmZpZyBpdGVtcy4uLjwveWVsbG93PlxuIik7CiAgICAkU2VsZi0+UHJpbnQoICI8eWVsbG93PiIgLiAoICc9JyB4IDY5ICkgLiAiPC95ZWxsb3c+XG4iICk7CgogICAgIyBleHBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+RXhwb3J0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoICI8Z3JlZW4+IiAuICggJy0nIHggNjkgKSAuICI8L2dyZWVuPlxuIiApOwogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+U3VjY2VzczogJFJlc3VsdC0+e1N1Y2Nlc3N9IHN1Y2NlZWRlZDwvZ3JlZW4+XG4iKTsKICAgIGlmICggJFJlc3VsdC0+e0ZhaWxlZH0gKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIiRSZXN1bHQtPntGYWlsZWR9IGZhaWxlZC5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RXJyb3I6ICRSZXN1bHQtPntGYWlsZWR9IGZhaWxlZC48L2dyZWVuPlxuIik7CiAgICB9CgogICAgbXkgJERlc3RpbmF0aW9uRmlsZSA9ICRTZWxmLT5HZXRBcmd1bWVudCgnZGVzdGluYXRpb24nKTsKCiAgICBpZiAoJERlc3RpbmF0aW9uRmlsZSkgewoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgICMgc2F2ZSBkZXN0aW5hdGlvbiBjb250ZW50IHRvIGZpbGUKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJERlc3RpbmF0aW9uRmlsZSwKICAgICAgICAgICAgQ29udGVudCAgPT4gXCRGaWxlQ29udGVudCwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIkNhbid0IHdyaXRlIGZpbGUgJERlc3RpbmF0aW9uRmlsZS5cbkV4cG9ydCBhYm9ydGVkLlxuIik7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RmlsZSAkRGVzdGluYXRpb25GaWxlIHNhdmVkLjwvZ3JlZW4+XG4iKTsKCiAgICB9CgogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RXhwb3J0IGNvbXBsZXRlLjwvZ3JlZW4+XG4iKTsKICAgICRTZWxmLT5QcmludCggIjxncmVlbj4iIC4gKCAnLScgeCA2OSApIC4gIjwvZ3JlZW4+XG4iICk7CiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKCiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7Cm15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7Cm15ICRIZWxwZXIgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9CiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ltcG9ydEV4cG9ydCcgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSW1wb3J0RXhwb3J0LScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKICAgIH0KCiAgICAjIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSB0ZW1wbGF0ZSBuYW1lcwpteSBAVGVtcGxhdGVOYW1lOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiA1ICkgewoKICAgIHB1c2ggQFRlbXBsYXRlTmFtZSwgJ1VuaXRUZXN0JyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gb2JqZWN0IG5hbWVzCm15IEBPYmplY3ROYW1lOwpwdXNoIEBPYmplY3ROYW1lLCAnVW5pdFRlc3QnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIG5lZWRlZCBmb3JtYXQgbmFtZXMKbXkgQEZvcm1hdE5hbWUgPSAoJ0NTVicpOwoKIyBnZXQgb3JpZ2luYWwgdGVtcGxhdGUgbGlzdCBmb3IgbGF0ZXIgY2hlY2tzIChhbGwgZWxlbWVudHMpCm15ICRUZW1wbGF0ZUxpc3QxQWxsID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGdldCBvcmlnaW5hbCB0ZW1wbGF0ZSBsaXN0IGZvciBsYXRlciBjaGVja3MgKGFsbCBlbGVtZW50cykKbXkgJFRlbXBsYXRlTGlzdDFPYmplY3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSXRlbURhdGEgPSBbCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50JywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50IFVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICIgXHQgXG4gXHIgIiAuICRPYmplY3ROYW1lWzBdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBGb3JtYXQgID0+ICIgXHQgXG4gXHIgIiAuICRGb3JtYXROYW1lWzBdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgIiAuICRUZW1wbGF0ZU5hbWVbMl0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgIiAuICRUZW1wbGF0ZU5hbWVbMl0gLiAiVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzJdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseSAoVW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAnIMaVIMaYICcgLiAkT2JqZWN0TmFtZVswXSAuICcgxrUgxrsgJywKICAgICAgICAgICAgRm9ybWF0ICA9PiAnIMeTIMejICcgLiAkRm9ybWF0TmFtZVswXSAuICcgx6Ugx64gJywKICAgICAgICAgICAgTmFtZSAgICA9PiAnIMe3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJ8aVxpgnIC4gJE9iamVjdE5hbWVbMF0gLiAnxrXGuycsCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICfHk8ejJyAuICRGb3JtYXROYW1lWzBdIC4gJ8elx64nLAogICAgICAgICAgICBOYW1lICAgICA9PiAnx7cgyJwgJyAuICRUZW1wbGF0ZU5hbWVbM10gLiAnIMieIMigJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBBZGRlZFRlbXBsYXRlSURzOwoKVEVNUExBVEU6CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IHRlbXBsYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCggJXsgJEl0ZW0tPntBZGR9IH0gKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZUlEKSB7CiAgICAgICAgICAgIHB1c2ggQEFkZGVkVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSAtIFRlbXBsYXRlS2V5OiAkVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSggJFRlbXBsYXRlSUQsICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlQWRkKCkiICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGVtcGxhdGUgd2FzIGFkZGVkCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgdGVtcGxhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVHZXQtPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlR2V0KCkgLSAkVGVtcGxhdGVBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IHRlbXBsYXRlIGlkIHZhcmlhYmxlCiAgICAgICAgaWYgKCAhJEFkZGVkVGVtcGxhdGVJRHNbLTFdICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOLiBQbGVhc2UgYWRkIGEgdGVtcGxhdGUgZmlyc3QuIgogICAgICAgICAgICApOwogICAgICAgICAgICBsYXN0IFRFTVBMQVRFOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHRlbXBsYXRlCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlVXBkYXRlKCkgLSBUZW1wbGF0ZUtleTogJEFkZGVkVGVtcGxhdGVJRHNbLTFdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewoKICAgICMgaW5jcmVtZW50IHRoZSBjb3VudGVyCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAxIChjaGVjayBhcnJheSByZWZlcmVuY2VzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDFBbGwgZXEgJ0FSUkFZJyAmJiByZWYgJFRlbXBsYXRlTGlzdDFPYmplY3QgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAobGlzdCBtdXN0IGJlIGVtcHR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBsaXN0CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFPYmplY3R9IGVxIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGVtcHR5IGxpc3QiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDIgKGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVMaXN0MiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRUZW1wbGF0ZUxpc3QyIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGFycmF5IHJlZmVyZW5jZSIsCik7CgpteSAkVGVtcGxhdGVMaXN0Q291bnQgPSBzY2FsYXIgQHskVGVtcGxhdGVMaXN0Mn0gLSBzY2FsYXIgQHskVGVtcGxhdGVMaXN0MUFsbH07CgojIGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcwokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZUxpc3RDb3VudCBlcSBzY2FsYXIgQEFkZGVkVGVtcGxhdGVJRHMsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAxIChhZGQgb25lIHRlbXBsYXRlIGFuZCBkZWxldGUgaXQpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGFkZCBhIHRlc3QgdGVtcGxhdGUKbXkgJFRlbXBsYXRlRGVsZXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzRdLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGhhdmUgb25lIGVsZW1lbnQgbW9yZQokU2VsZi0+VHJ1ZSgKICAgIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0MX0gZXEgKCBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDJ9ICkgLSAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSAtIG51bWJlciBvZiBsaXN0ZWQgZWxlbWVudHMiLAopOwoKIyBkZWxldGUgdGhlIG5ldyB0ZW1wbGF0ZQpteSAkVGVtcGxhdGVEZWxldGUxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURlbGV0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgc3VjY2Vzc2Z1bAokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZURlbGV0ZTEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIiwKKTsKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgZWxlbWVudHMKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0M30sCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAyIChkZWxldGUgYWxsIHVuaXQgdGVzdCB0ZW1wbGF0ZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkVGVtcGxhdGVJRCAoQEFkZGVkVGVtcGxhdGVJRHMpIHsKCiAgICAjIGRlbGV0ZSB0aGUgdGVtcGxhdGUKICAgIG15ICRTdWNjZXNzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgc3VjY2VzcwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSBUZW1wbGF0ZUlEICRUZW1wbGF0ZUlEIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRPYmplY3RMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3RPcmcgPQogICAgJENvbmZpZ09iamVjdC0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRPYmplY3RMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKIyBsaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gaGFzaCByZWZlcmVuY2UiLAopOwoKIyBjaGVjayB0aGUgbGlzdApLRVk6CmZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JE9iamVjdExpc3QxfSApIHsKCiAgICBpZiAoICEkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9ICkgewogICAgICAgICRPYmplY3RMaXN0MVRlc3RMaXN0LT57RHVtbXl9ID0gMTsKICAgIH0KCiAgICBuZXh0IEtFWSBpZiAkT2JqZWN0TGlzdDEtPnskS2V5fSBuZSAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9LT57TmFtZX07CgogICAgZGVsZXRlICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX07Cn0KCiRTZWxmLT5UcnVlKAogICAgISV7JE9iamVjdExpc3QxVGVzdExpc3R9LAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gY29udGVudCBpcyB2YWxpZCIsCik7CgojIHJlc3RvcmUgb3JpZ2luYWwgb2JqZWN0IGxpc3QKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkT2JqZWN0TGlzdE9yZywKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJEZvcm1hdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdE9yZyA9CiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKIyBzZXQgdGVzdCBsaXN0CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskRm9ybWF0TGlzdDF9ICkgewoKICAgIGlmICggISRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJEZvcm1hdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRGb3JtYXRMaXN0MS0+eyRLZXl9IG5lICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskRm9ybWF0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgbGlzdAokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0T3JnLAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJE1haW5PYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkSW1wb3J0RXhwb3J0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKbXkgJEZvcm1hdEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBob21lIGRpcmVjdG9yeQokU2VsZi0+e0hvbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyk7CgojIGFkZCBzb21lIHRlc3QgdGVtcGxhdGVzIGZvciBsYXRlciBjaGVja3MKbXkgQFRlbXBsYXRlSURzOwpmb3IgKCAxIC4uIDMwICkgewoKICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgIyBhZGQgYSB0ZXN0IHRlbXBsYXRlIGZvciBsYXRlciBjaGVja3MKICAgIG15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgT2JqZWN0ICA9PiAnVW5pdFRlc3QnIC4gJFJhbmRvbUlELAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVW5pdFRlc3QnIC4gJFJhbmRvbUlELAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHB1c2ggQFRlbXBsYXRlSURzLCAkVGVtcGxhdGVJRDsKfQoKbXkgJFRlc3RDb3VudCA9IDE7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIENTViBpdGVtKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgojIGNoZWNrIGZvcm1hdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdExpc3QxICYmIHJlZiAkRm9ybWF0TGlzdDEgZXEgJ0hBU0gnICYmICRGb3JtYXRMaXN0MS0+e0NTVn0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBDU1YgZXhpc3RzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGFyYXRvcicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbiBTZXBhcmF0b3InLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gJ1RhYnVsYXRvciAoVEFCKScsCiAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgQ29sb24gICAgID0+ICdDb2xvbiAoOiknLAogICAgICAgICAgICAgICAgRG90ICAgICAgID0+ICdEb3QgKC4pJywKICAgICAgICAgICAgICAgIENvbW1hICAgICA9PiAnQ29tbWEgKCwpJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ2hhcnNldCcsCiAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMjAsCiAgICAgICAgICAgIFJlYWRvbmx5ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdJbmNsdWRlQ29sdW1uSGVhZGVycycsCiAgICAgICAgTmFtZSAgPT4gJ0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgfSwKICAgIH0sCl07CgokU2VsZi0+SXNEZWVwbHkoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDEsCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0MiwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgdGVzdCAxIChjaGVjayBhdHRyaWJ1dGUgaGFzaCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlcwpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtbicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICA9PiAnVFQnLAogICAgICAgICAgICBEYXRhICAgICA9PiAnJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICB9LAogICAgfSwKXTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEsCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSW1wb3J0RGF0YVRlc3RzID0gWwoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gc291cmNlIGNvbnRlbnQgYXJlIGdpdmVuIChlbXB0eSBhcnJheSByZWZlcmVuY2UgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gW10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiB7fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIFNlcGFyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjaGFyc2V0IGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiBidXQgc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKGVtcHR5IGFycmF5IHJlZmVyZW5jZSBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzNdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geycnfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgaXMgb25seSBhIHN0cmluZyB3aXRoIHNwYWNlcyAob25lIGNlbGwgYXJyYXkgd2l0aCB0aGUgc3BhY2VzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7JyAgJ30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWycgICddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBUYWJ1bGF0b3IgaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbJ1JvdzEtQ29sMTtSb3cxLUNvbDI7Um93MS1Db2wzJ10sCiAgICAgICAgICAgIFsnUm93Mi1Db2wxO1JvdzItQ29sMjtSb3cyLUNvbDMnXSwKICAgICAgICAgICAgWydSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMyddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBTZW1pY29sb24gaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbIlJvdzEtQ29sMVx0Um93MS1Db2wyXHRSb3cxLUNvbDMiXSwKICAgICAgICAgICAgWyJSb3cyLUNvbDFcdFJvdzItQ29sMlx0Um93Mi1Db2wzIl0sCiAgICAgICAgICAgIFsiUm93My1Db2wxXHRSb3czLUNvbDJcdFJvdzMtQ29sMyJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgJ1Rlc3QgMSAtIDInLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbgogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4KICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbgogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDctT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnMFJvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDgtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJzBSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgpdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIEltcG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskSW1wb3J0RGF0YVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZUltcG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZUltcG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgSW1wb3J0RGF0YUdldAogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9ICkgewogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fSA9IHt9OwogICAgfQoKICAgICMgc2V0IHNvdXJjZSBjb250ZW50CiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e1NvdXJjZUZpbGV9CiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0KICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fSBlcSAnU291cmNlRmlsZScKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRTb3VyY2VGaWxlID0gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e1NvdXJjZUZpbGV9OwoKICAgICAgICAjIHJlYWQgc291cmNlIGZpbGUKICAgICAgICBteSAkU291cmNlQ29udGVudCA9ICRNYWluT2JqZWN0LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNlbGYtPntIb21lfSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS9JbXBvcnRFeHBvcnQvJyAuICRTb3VyY2VGaWxlLAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9ID0gJFNvdXJjZUNvbnRlbnQ7CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIGZvcm1hdCBkYXRhCiAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZE9iamVjdC0+SW1wb3J0RGF0YUdldCgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkSW1wb3J0RGF0YSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoIHJlZiAkSW1wb3J0RGF0YSBuZSAnQVJSQVknICkgewoKICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2Ygcm93cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRJbXBvcnREYXRhfSwKICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIHJvd3MiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbnRlbnQgb2YgaW1wb3J0IGRhdGEKICAgIG15ICRDb3VudGVyUm93ID0gMDsKICAgIFJPVzoKICAgIGZvciBteSAkSW1wb3J0Um93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXh0cmFjdCByZWZlcmVuY2Ugcm93CiAgICAgICAgbXkgJFJlZmVyZW5jZVJvdyA9ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPlskQ291bnRlclJvd107CgogICAgICAgIGlmICggcmVmICRJbXBvcnRSb3cgbmUgJ0FSUkFZJyB8fCByZWYgJFJlZmVyZW5jZVJvdyBuZSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gaW1wb3J0IHJvdyBhbmQgcmVmZXJlbmNlIHJvdyBtYXRjaGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVDsKICAgICAgICB9CgogICAgICAgICMgIyBwcmludCB0aGUgZmlsZSBuYW1lCiAgICAgICAgIyAkU2VsZi0+VHJ1ZSgKICAgICAgICAjICAgICAxLAogICAgICAgICMgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfSwKICAgICAgICAjICk7CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGNvbHVtbnMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRJbXBvcnRSb3d9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlUm93fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gc2FtZSBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JEltcG9ydFJvd30gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ2VsbCApIHsKICAgICAgICAgICAgICAgICRDZWxsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjZWxsIGRhdGEKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENlbGwsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpICIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXJSb3crKzsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkRXhwb3J0RGF0YVRlc3RzID0gWwoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gU2VwYXJhdG9yIGFuZCBjaGFyc2V0IGFyZSBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2hhcnNldCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY29sdW1uIFNlcGFyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI7IiI7IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlwiXCJcdFwiXCJcdFwiXCIiLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI6IiI6IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiLiIiLiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOyIiOycsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlx0XCJcIlx0IiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICc6IiI6JywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnLiIiLicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb21tYScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIsIlJvdzEtQ29sMiIsIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlwiUm93MS1Db2wxXCJcdFwiUm93MS1Db2wyXCJcdFwiUm93MS1Db2wzXCIiLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiLiJSb3cxLUNvbDIiLiJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiBxcXsiXG5UZXN0IDEiOyJUZXN0IFxuIDIiOyJUZXN0IDMgXFxuXFx0XFxyXFxzIjsiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICBxcXsiXG5UZXN0IDEiXHQiVGVzdCBcbiAyIlx0IlRlc3QgMyBcXG5cXHRcXHJcXHMiXHQiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSI6IlRlc3QgXG4gMiI6IlRlc3QgMyBcXG5cXHRcXHJcXHMiOiJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSIuIlRlc3QgXG4gMiIuIlRlc3QgMyBcXG5cXHRcXHJcXHMiLiJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOyIgICAgIjsiVGVzdCAgIjsiICAgIFRlc3QiOyIiOyJUZXN0IjsiIjsiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICJcIiAgVGVzdCAgXCJcdFwiICAgIFwiXHRcIlRlc3QgIFwiXHRcIiAgICBUZXN0XCJcdFwiXCJcdFwiVGVzdFwiXHRcIlwiXHRcIiBcIiIsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICI6IiAgICBUZXN0IjoiIjoiVGVzdCI6IiI6IiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIi4iICAgICIuIlRlc3QgICIuIiAgICBUZXN0Ii4iIi4iVGVzdCIuIiIuIiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiOyI+PEB+XCd9e1tdXCI7IiI7IiIiIiI7Ozo6Li4tLV9fIyMiJwogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciPjxAflwnfXtbXVxcIicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyIiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI6Ij48QH5cJ317W11cIjoiIjoiIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCIuIj48QH5cJ317W11cXCIuIiIuIiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiOyLRryDRtCDRvyI7ItKCINKKINKWICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCIg0aog0awg0bJcIlx0XCLRryDRtCDRv1wiXHRcItKCINKKINKWIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI6ItGvING0ING/Ijoi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIi4i0a8g0bQg0b8iLiLSgiDSiiDSliAiJywKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskRXhwb3J0RGF0YVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZUV4cG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZUV4cG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgRXhwb3J0RGF0YVNhdmUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSA9IHt9OwogICAgfQoKICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBleHBvcnQgZGF0YSByb3cKICAgIG15ICRFeHBvcnRTdHJpbmcgPSAkRm9ybWF0QmFja2VuZE9iamVjdC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSB9LAogICAgKTsKCiAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRFeHBvcnRTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJEV4cG9ydFN0cmluZyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e0V4cG9ydERhdGFSb3d9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBleHBvcnQgc3RyaW5nCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEV4cG9ydFN0cmluZywKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlLgoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwp1c2UgRmlsZTo6UGF0aCBxdyhybXRyZWUpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbW1hbmRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6SW1wb3J0RXhwb3J0OjpJbXBvcnQnKTsKbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgdGVzdCBjb21tYW5kIHdpdGhvdXQgLS10ZW1wbGF0ZS1udW1iZXIgb3B0aW9uCm15ICRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIk5vIC0tdGVtcGxhdGUtbnVtYmVyICAtIGV4aXQgY29kZSIsCik7CgojIGFkZCB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgTmFtZSAgICA9PiAnVGVtcGxhdGUnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVJRCwKICAgICJJbXBvcnQvRXhwb3J0IHRlbXBsYXRlIGlzIGNyZWF0ZWQgLSAkVGVtcGxhdGVJRCIsCik7CgojIGdldCAnSGFyZHdhcmUnIGNhdGFsb2cgY2xhc3MgSUQKbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgTmFtZSAgPT4gJ0hhcmR3YXJlJywKKTsKbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiMgZ2V0IG9iamVjdCBkYXRhIGZvciB0ZXN0IHRlbXBsYXRlCm15ICVUZW1wbGF0ZVJlZiA9ICgKICAgICdDbGFzc0lEJyAgPT4gJEhhcmR3YXJlQ29uZmlnSXRlbUlELAogICAgJ0NvdW50TWF4JyA9PiAxMCwKKTsKbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBPYmplY3REYXRhID0+IFwlVGVtcGxhdGVSZWYsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIk9iamVjdERhdGEgZm9yIHRlc3QgdGVtcGxhdGUgaXMgYWRkZWQiLAopOwoKIyBhZGQgdGhlIGZvcm1hdCBkYXRhIG9mIHRoZSB0ZXN0IHRlbXBsYXRlCm15ICVGb3JtYXREYXRhID0gKAogICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJ1VURi04JywKICAgIENvbHVtblNlcGFyYXRvciAgICAgID0+ICdDb21tYScsCiAgICBJbmNsdWRlQ29sdW1uSGVhZGVycyA9PiAxLAopOwokU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIEZvcm1hdERhdGEgPT4gXCVGb3JtYXREYXRhLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJGb3JtYXREYXRhIGZvciB0ZXN0IHRlbXBsYXRlIGlzIGFkZGVkIiwKKTsKCiMgc2F2ZSB0aGUgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQpteSAlU2VhcmNoRGF0YSA9ICgKICAgIE5hbWUgPT4gJ1Rlc3RDb25maWdJdGVtKicsCik7CiRTdWNjZXNzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YVNhdmUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgU2VhcmNoRGF0YSA9PiBcJVNlYXJjaERhdGEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGFkZCBtYXBwaW5nIGRhdGEgZm9yIHRlc3QgdGVtcGxhdGUKZm9yIG15ICRPYmplY3REYXRhVmFsdWUgKHF3KCBOYW1lIERlcGxTdGF0ZSBJbmNpU3RhdGUgKSkgewoKICAgIG15ICRNYXBwaW5nSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nQWRkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBteSAlTWFwcGluZ09iamVjdERhdGEgPSAoIEtleSA9PiAkT2JqZWN0RGF0YVZhbHVlICk7CiAgICBteSAkU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFwlTWFwcGluZ09iamVjdERhdGEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIk9iamVjdERhdGEgZm9yIHRlc3QgdGVtcGxhdGUgaXMgbWFwcGVkIC0gJE9iamVjdERhdGFWYWx1ZSIsCiAgICApOwp9CgojIG1ha2UgZGlyZWN0b3J5IGZvciBleHBvcnQgZmlsZQpteSAkU291cmNlUGF0aAogICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0hvbWUnKSAuICIvc2NyaXB0cy90ZXN0L3NhbXBsZS9JbXBvcnRFeHBvcnQvVGVtcGxhdGVFeHBvcnQuY3N2IjsKCiMgdGVzdCBjb21tYW5kIHdpdGggd3JvbmcgdGVtcGxhdGUgbnVtYmVyCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS10ZW1wbGF0ZS1udW1iZXInLCAkSGVscGVyLT5HZXRSYW5kb21JRCgpLCAkU291cmNlUGF0aCAuICdUZW1wbGF0ZUV4cG9ydC5jc3YnICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIkNvbW1hbmQgd2l0aCB3cm9uZyB0ZW1wbGF0ZSBudW1iZXIgLSBleGl0IGNvZGUiLAopOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aG91dCBTb3VyY2UgYXJndW1lbnQKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLXRlbXBsYXRlLW51bWJlcicsICRUZW1wbGF0ZUlEICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIk5vIFNvdXJjZSBhcmd1bWVudCAtIGV4aXQgY29kZSIsCik7CgojIHRlc3QgY29tbWFuZCB3aXRoIC0tdGVtcGxhdGUtbnVtYmVyIG9wdGlvbiBhbmQgU291cmNlIGFyZ3VtZW50CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS10ZW1wbGF0ZS1udW1iZXInLCAkVGVtcGxhdGVJRCwgJFNvdXJjZVBhdGggKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiT3B0aW9uIC0gLS10ZW1wbGF0ZS1udW1iZXIgb3B0aW9uIGFuZCBTb3VyY2UgYXJndW1lbnQiLAopOwoKIyBnZXQgY29uZmlnIGl0ZW0gSURzCm15ICRDb25maWdJdGVtSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgIE5hbWUgPT4gJ1Rlc3RDb25maWdJdGVtKicKKTsKbXkgJE51bUNvbmZpZ0l0ZW1JbXBvcnRlZCA9IHNjYWxhciBAeyRDb25maWdJdGVtSURzfTsKCiMgY2hlY2sgaWYgdGhlIGNvbmZpZyBpdGVtcyBhcmUgaW1wb3J0ZWQKJFNlbGYtPlRydWUoCiAgICAkTnVtQ29uZmlnSXRlbUltcG9ydGVkLAogICAgIlRoZXJlIGFyZSAkTnVtQ29uZmlnSXRlbUltcG9ydGVkIGltcG9ydGVkIGNvbmZpZyBpdGVtcyIsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UuCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwp1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGggcm10cmVlKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDb21tYW5kT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6SW1wb3J0RXhwb3J0OjpFeHBvcnQnKTsKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aG91dCAtLXRlbXBsYXRlLW51bWJlciBvcHRpb24KbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiTm8gLS10ZW1wbGF0ZS1udW1iZXIgIC0gZXhpdCBjb2RlIiwKKTsKCiMgZ2V0ICdIYXJkd2FyZScgY2F0YWxvZyBjbGFzcyBJRApteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgTmFtZSAgPT4gJ0hhcmR3YXJlJywKKTsKbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiMgZ2V0ICdQcm9kdWN0aW9uJyBkZXBsb3ltZW50IHN0YXRlIElEcwpteSAkUHJvZHVjdGlvbkRlcGxTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgIE5hbWUgID0+ICdQcm9kdWN0aW9uJywKKTsKbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCA9ICRQcm9kdWN0aW9uRGVwbFN0YXRlRGF0YVJlZi0+e0l0ZW1JRH07CgpteSBAQ29uZmlnSXRlbUlEczsKCiMgYWRkIHRlc3QgY29uZmlnIGl0ZW1zCmZvciAoIDEgLi4gMTAgKSB7CgogICAgIyBjcmVhdGUgQ29uZmlnSXRlbSBudW1iZXIKICAgIG15ICRDb25maWdJdGVtTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICAgICAgVHlwZSAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBhZGQgdGVzdCBDb25maWdJdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgIkNvbmZpZyBpdGVtIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbUlEIiwKICAgICk7CgogICAgbXkgJENvbmZpZ0l0ZW1OYW1lID0gJ1Rlc3RDb25maWdJdGVtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICBteSAkVmVyc2lvbklEICAgICAgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkUHJvZHVjdGlvbkRlcGxTdGF0ZUlELAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJWZXJzaW9uIGZvciBjb25maWcgaXRlbSAkQ29uZmlnSXRlbUlEIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbU5hbWUiLAogICAgKTsKCiAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkQ29uZmlnSXRlbUlEOwp9CgojIGdldCBJbXBvcnRFeHBvcnQgb2JqZWN0Cm15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CgojIGFkZCB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgTmFtZSAgICA9PiAnVGVtcGxhdGUnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVJRCwKICAgICJJbXBvcnQvRXhwb3J0IHRlbXBsYXRlIGlzIGNyZWF0ZWQgLSAkVGVtcGxhdGVJRCIsCik7CgojIGdldCBvYmplY3QgZGF0YSBmb3IgdGVzdCB0ZW1wbGF0ZQpteSAlVGVtcGxhdGVSZWYgPSAoCiAgICAnQ2xhc3NJRCcgID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICdDb3VudE1heCcgPT4gMTAsCik7Cm15ICRTdWNjZXNzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YVNhdmUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgT2JqZWN0RGF0YSA9PiBcJVRlbXBsYXRlUmVmLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJPYmplY3REYXRhIGZvciB0ZXN0IHRlbXBsYXRlIGlzIGFkZGVkIiwKKTsKCiMgYWRkIHRoZSBmb3JtYXQgZGF0YSBvZiB0aGUgdGVzdCB0ZW1wbGF0ZQpteSAlRm9ybWF0RGF0YSA9ICgKICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICdVVEYtOCcsCiAgICBDb2x1bW5TZXBhcmF0b3IgICAgICA9PiAnQ29tbWEnLAogICAgSW5jbHVkZUNvbHVtbkhlYWRlcnMgPT4gMSwKKTsKJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhU2F2ZSgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBGb3JtYXREYXRhID0+IFwlRm9ybWF0RGF0YSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRm9ybWF0RGF0YSBmb3IgdGVzdCB0ZW1wbGF0ZSBpcyBhZGRlZCIsCik7CgojIHNhdmUgdGhlIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKbXkgJVNlYXJjaERhdGEgPSAoCiAgICBOYW1lID0+ICdUZXN0Q29uZmlnSXRlbSonLAopOwokU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFNlYXJjaERhdGEgPT4gXCVTZWFyY2hEYXRhLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBhZGQgbWFwcGluZyBkYXRhIGZvciB0ZXN0IHRlbXBsYXRlCmZvciBteSAkT2JqZWN0RGF0YVZhbHVlIChxdyggTmFtZSBEZXBsU3RhdGUgSW5jaVN0YXRlICkpIHsKCiAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJU1hcHBpbmdPYmplY3REYXRhID0gKCBLZXkgPT4gJE9iamVjdERhdGFWYWx1ZSApOwogICAgbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU1hcHBpbmdPYmplY3REYXRhLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJPYmplY3REYXRhIGZvciB0ZXN0IHRlbXBsYXRlIGlzIG1hcHBlZCAtICRPYmplY3REYXRhVmFsdWUiLAogICAgKTsKfQoKIyBtYWtlIGRpcmVjdG9yeSBmb3IgZXhwb3J0IGZpbGUKbXkgJERlc3RpbmF0aW9uUGF0aCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSG9tZScpIC4gIi92YXIvdG1wL0ltcG9ydEV4cG9ydC8iOwpta3BhdGgoIFskRGVzdGluYXRpb25QYXRoXSwgMCwgMDc3MCApOyAgICAjIyBubyBjcml0aWMKCiMgdGVzdCBjb21tYW5kIHdpdGggd3JvbmcgdGVtcGxhdGUgbnVtYmVyCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKAogICAgJy0tdGVtcGxhdGUtbnVtYmVyJywKICAgICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpLAogICAgJERlc3RpbmF0aW9uUGF0aCAuICdUZW1wbGF0ZUV4cG9ydC5jc3YnCik7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIkNvbW1hbmQgd2l0aCB3cm9uZyB0ZW1wbGF0ZSBudW1iZXIgLSBleGl0IGNvZGUiLAopOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aG91dCBkZXN0aW5hdGlvbiBhcmd1bWVudAokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tdGVtcGxhdGUtbnVtYmVyJywgJFRlbXBsYXRlSUQgKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiTm8gZGVzdGluYXRpb24gYXJndW1lbnQgLSBleGl0IGNvZGUiLAopOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aCAtLXRlbXBsYXRlLW51bWJlciBvcHRpb24gYW5kIGRlc3RpbmF0aW9uIGFyZ3VtZW50CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS10ZW1wbGF0ZS1udW1iZXInLCAkVGVtcGxhdGVJRCwgJERlc3RpbmF0aW9uUGF0aCAuICdUZW1wbGF0ZUV4cG9ydC5jc3YnICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAtIC0tdGVtcGxhdGUtbnVtYmVyIG9wdGlvbiBhbmQgZGVzdGluYXRpb24gYXJndW1lbnQiLAopOwoKIyByZW1vdmUgdGVzdCBkZXN0aW5hdGlvbiBwYXRoCiRTdWNjZXNzID0gcm10cmVlKCBbJERlc3RpbmF0aW9uUGF0aF0gKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJUZXN0IGRpcmVjdG9yeSBkZWxldGVkIC0gJERlc3RpbmF0aW9uUGF0aCIsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UuCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgICAgICMgZ2V0ICdMb2NhdGlvbicgY2F0YWxvZyBjbGFzcyBJRHMKICAgICAgICBteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdMb2NhdGlvbicsCiAgICAgICAgKTsKICAgICAgICBteSAkTG9jYXRpb25Db25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbURhdGFSZWYtPntJdGVtSUR9OwoKICAgICAgICAjIGdldCAnUHJvZHVjdGlvbicgZGVwbG95bWVudCBzdGF0ZSBJRAogICAgICAgIG15ICREZXBsU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICk7CiAgICAgICAgbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVEYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBjcmVhdGUgQ29uZmlnSXRlbSBudW1iZXIKICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICBDbGFzc0lEID0+ICRMb2NhdGlvbkNvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgICJDb25maWdJdGVtIG51bWJlciBpcyBjcmVhdGVkIC0gJENvbmZpZ0l0ZW1OdW1iZXIiLAogICAgICAgICk7CgogICAgICAgICMgYWRkICdMb2NhdGlvbicgdGVzdCBDb25maWdJdGVtCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICBDbGFzc0lEID0+ICRMb2NhdGlvbkNvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiQ29uZmlnSXRlbSAnTG9jYXRpb24nIGlzIGNyZWF0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBhIG5ldyB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25OYW1lID0gIlNlbGVuaXVtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFZlcnNpb25JRCAgID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVmVyc2lvbk5hbWUsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCwKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAgICAgIlRlc3QgdmVyc2lvbiBvZiB0aGUgQ29uZmlnSXRlbSBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNvbmZpZ2l0ZW0nIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFkbWluSW1wb3J0RXhwb3J0IHNjcmVlbgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pbkltcG9ydEV4cG9ydCIpOwoKICAgICAgICAjIGNoZWNrIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGNsaWNrIG9uICdBZGQgdGVtcGxhdGUnCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFkbWluSW1wb3J0RXhwb3J0O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQnICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgYW5kIGlucHV0IHN0ZXAgMSBvZiA1IHNjcmVlbgogICAgICAgIGZvciBteSAkU3RlcE9uZUlEICgKICAgICAgICAgICAgcXcoTmFtZSBPYmplY3QgRm9ybWF0IFZhbGlkSUQgQ29tbWVudCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkU3RlcE9uZUlEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KICAgICAgICBteSAkSW1wb3J0RXhwb3J0TmFtZSA9ICJJbXBvcnRFeHBvcnQiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRJbXBvcnRFeHBvcnROYW1lKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNPYmplY3QnKS52YWwoJ0lUU01Db25maWdJdGVtJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0Zvcm1hdCcpLnZhbCgnQ1NWJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCdTZWxlbml1bVRlc3QnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBjbGFzcz0nUHJpbWFyeSBDYWxsRm9yQWN0aW9uJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgYW5kIGlucHV0IHN0ZXAgMiBvZiA1IHNjcmVlbgogICAgICAgIGZvciBteSAkU3RlcFR3b0lEICgKICAgICAgICAgICAgcXcoQ2xhc3NJRCBDb3VudE1heCBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRTdGVwVHdvSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0NsYXNzSUQnKS52YWwoJyRMb2NhdGlvbkNvbmZpZ0l0ZW1JRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAY2xhc3M9J1ByaW1hcnkgQ2FsbEZvckFjdGlvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIGFuZCBpbnB1dCBzdGVwIDMgb2YgNSBzY3JlZW4KICAgICAgICBmb3IgbXkgJFN0ZXBUaHJlZUlEICgKICAgICAgICAgICAgcXcoQ29sdW1uU2VwYXJhdG9yIENoYXJzZXQgSW5jbHVkZUNvbHVtbkhlYWRlcnMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJFN0ZXBUaHJlZUlEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDb2x1bW5TZXBhcmF0b3InKS52YWwoJ0NvbW1hJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBjbGFzcz0nUHJpbWFyeSBDYWxsRm9yQWN0aW9uJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgYW5kIGlucHV0IHN0ZXAgNCBvZiA1IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI01hcHBpbmdBZGRCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgZm9yIG15ICRTdGVwRm91cklEICgKICAgICAgICAgICAgcXcoS2V5IElkZW50aWZpZXIpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi4vLypbXEBpZD0nT2JqZWN0OjowOjokU3RlcEZvdXJJRCddIik7CgogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFN0ZXBGb3VyQ2xhc3MgKAogICAgICAgICAgICBxdyhBcnJvd1VwIEFycm93RG93biBEZWxldGVDb2x1bW4pCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuJFN0ZXBGb3VyQ2xhc3MiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIHNlbGVjdCAnTnVtYmVyJyBtYXBwaW5nIGVsZW1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLi8vKltcQGlkPSdPYmplY3Q6OjA6OktleSddL29wdGlvblsyXSIpLT5jbGljaygpOwoKICAgICAgICAjIGFkZCBhbmQgc2VsZWN0ICdOYW1lJyBtYXBwaW5nIGVsZW1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNNYXBwaW5nQWRkQnV0dG9uIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIuLy8qW1xAaWQ9J09iamVjdDo6MTo6S2V5J10vb3B0aW9uWzNdIiktPmNsaWNrKCk7CgogICAgICAgICMgYWRkIGFuZCBzZWxlY3QgJ0RlcGxveW1lbnQgU3RhdGUnIG1hcHBpbmcgZWxlbWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI01hcHBpbmdBZGRCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi4vLypbXEBpZD0nT2JqZWN0OjoyOjpLZXknXS9vcHRpb25bNF0iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBhZGQgYW5kIHNlbGVjdCAnSW5jaWRlbnQgU3RhdGUnIG1hcHBpbmcgZWxlbWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI01hcHBpbmdBZGRCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi4vLypbXEBpZD0nT2JqZWN0OjozOjpLZXknXS9vcHRpb25bNV0iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXROZXh0QnV0dG9uIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIHN0ZXAgNSBvZiA1IHNjcmVlbgogICAgICAgIGZvciBteSAkU3RlcEZvdXJJRCAoCiAgICAgICAgICAgIHF3KFJlc3RyaWN0RXhwb3J0IE51bWJlciBOYW1lIERlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMgVHlwZSBQaG9uZTEgUGhvbmUyCiAgICAgICAgICAgIEZheCBFLU1haWwgQWRkcmVzcyBOb3RlKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRTdGVwRm91cklEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBzZWFyY2ggQ29uZmlnSXRlbSBieSBudW1iZXIgYW5kIGRlcGxveW1lbnQgc3RhdGUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSZXN0cmljdEV4cG9ydCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTnVtYmVyIiwgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoJENvbmZpZ0l0ZW1OdW1iZXIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAgICAgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRWZXJzaW9uTmFtZSk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRGVwbFN0YXRlSURzJykudmFsKCckUHJvZHVjdGlvbkRlcGxTdGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0luY2lTdGF0ZUlEcycpLnZhbCgnMScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAY2xhc3M9J1ByaW1hcnkgQ2FsbEZvckFjdGlvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CiAgICAgICAgbXkgJERCT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGdldCBUZW1wbGF0ZUlEIG9mIGNyZWF0ZWQgdGVzdCB0ZW1wbGF0ZQogICAgICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJEltcG9ydEV4cG9ydE5hbWUgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkVGVtcGxhdGVJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBuYXZpZ2F0ZSB0byB0ZXN0IGNyZWF0ZWQgQ29uZmlnSXRlbSBhbmQgdmVyaWZ5IGl0CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPSRDb25maWdJdGVtSUQiKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRWZXJzaW9uTmFtZSApID4gLTEsCiAgICAgICAgICAgICJUZXN0IENvbmZpZ0l0ZW0gbmFtZSAkVmVyc2lvbk5hbWUgLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBleHBvcnQgY3JlYXRlZCB0ZXN0IHRlbXBsYXRlCiAgICAgICAgbXkgJEV4cG9ydFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkV4cG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtLCBzbyBpdCBjYW4gYmUgaW1wb3J0ZWQgYmFjawogICAgICAgICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENhY2hlICAgICAgICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgQ29uZmlnSXRlbSBpcyBkZWxldGVkCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZmlnSXRlbSwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRDb25maWdJdGVtSUQiLAogICAgICAgICk7CgogICAgICAgICMgcmVmcmVzaCBzY3JlZW4gYW5kIHZlcmlmeSB0aGF0IHRlc3QgQ29uZmlnSXRlbSBkb2VzIG5vdCBleGlzdCBhbnltb3JlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEiICkgPiAtMSwKICAgICAgICAgICAgIlRlc3QgQ29uZmlnSXRlbSBuYW1lICRWZXJzaW9uTmFtZSBpcyBub3QgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IEV4cG9ydGVkIGZpbGUgdG8gYSBzeXN0ZW0KICAgICAgICBteSAkRXhwb3J0RmlsZU5hbWUgPSAiSVRTTUV4cG9ydCIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpIC4gIi5jc3YiOwogICAgICAgIG15ICRFeHBvcnRMb2NhdGlvbiA9ICRDb25maWdPYmplY3QtPkdldCgnSG9tZScpIC4gIi92YXIvdG1wLyIgLiAkRXhwb3J0RmlsZU5hbWU7CiAgICAgICAgbXkgJFN1Y2Nlc3MgICAgICAgID0gJE1haW5PYmplY3QtPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gICA9PiAkRXhwb3J0TG9jYXRpb24sCiAgICAgICAgICAgIENvbnRlbnQgICAgPT4gXCRFeHBvcnRSZXN1bHRSZWYtPntEZXN0aW5hdGlvbkNvbnRlbnR9LT5bMF0sCiAgICAgICAgICAgIE1vZGUgICAgICAgPT4gJ3V0ZjgnLAogICAgICAgICAgICBUeXBlICAgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAnNjY0JywKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkV4cG9ydCBmaWxlICRFeHBvcnRGaWxlTmFtZSAnJEV4cG9ydExvY2F0aW9uJyBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFkbWluSW1wb3J0RXhwb3J0IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluSW1wb3J0RXhwb3J0Iik7CgogICAgICAgICMgY2xpY2sgb24gJ0ltcG9ydCcKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdTdWJhY3Rpb249SW1wb3J0SW5mb3JtYXRpb247VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCcgKV0iKQogICAgICAgICAgICAtPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBzZWxlY3QgRXhwb3J0ZWQgZmlsZSBhbmQgc3RhcnQgaW1wb3J0aW5nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbY29udGFpbnMoXEBuYW1lLCBcJ1NvdXJjZUZpbGUnICldIiktPnNlbmRfa2V5cygkRXhwb3J0TG9jYXRpb24pOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3RhcnQgSW1wb3J0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgZm9yIGV4cGVjdGVkIG91dGNvbWUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICcoQ3JlYXRlZDogMSknICkgPiAtMSwKICAgICAgICAgICAgIkltcG9ydCB0ZXN0IENvbmZpZ0l0ZW0gLSBzdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIGltcG9ydGVkIHRlc3QgY3JlYXRlZCBDb25maWdJdGVtIGFuZCB2ZXJpZnkgaXQKICAgICAgICBteSAkSW1wb3J0ZWRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbUlEICsgMTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPSRJbXBvcnRlZENvbmZpZ0l0ZW1JRCIKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFZlcnNpb25OYW1lICkgPiAtMSwKICAgICAgICAgICAgIlRlc3QgQ29uZmlnSXRlbSBuYW1lICRWZXJzaW9uTmFtZSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbkltcG9ydEV4cG9ydCBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pbkltcG9ydEV4cG9ydCIpOwoKICAgICAgICAjIGNsaWNrIHRvIGRlbGV0ZSB0ZXN0IHRlbXBsYXRlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGVsZXRlVGVtcGxhdGVJRCRUZW1wbGF0ZUlEIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGltcG9ydGVkIENvbmZpZ0l0ZW0KICAgICAgICAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJEltcG9ydGVkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRJbXBvcnRlZENvbmZpZ0l0ZW1JRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBFeHBvcnRlZCBmaWxlIGZyb20gc3lzdGVtCiAgICAgICAgJFN1Y2Nlc3MgPSAkTWFpbk9iamVjdC0+RmlsZURlbGV0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEV4cG9ydExvY2F0aW9uLAogICAgICAgICAgICBUeXBlICAgICA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJFeHBvcnQgZmlsZSAkRXhwb3J0RmlsZU5hbWUgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICB9Cik7CgoxOwo=
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
w7zDtsOkw587w5zDlsOEDQrDn8Okw7bDvDvDhMOWw5wNCg==
w7zDtsOkw58Jw5zDlsOEDQrDn8Okw7bDvAnDhMOWw5wNCg==
IsO8w7bDpMOfIjoiw5zDlsOEIg0KIsOfw6TDtsO8Ijoiw4TDlsOcIg0K
IsO8w7bDpMOfIjsiw5zDlsOEIg0KIsOfw6TDtsO8Ijsiw4TDlsOcIg0K
IsO8w7bDpMOfIgkiw5zDlsOEIg0KIsOfw6TDtsO8Igkiw4TDlsOcIg0K
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiMFJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyIwUm93Mi1Db2wyIjsiUm93Mi1Db2wzIg0KIlJvdzMtQ29sMSI7IlJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
Ik5hbWUiLCJEZXBsb3ltZW50IFN0YXRlIiwiSW5jaWRlbnQgU3RhdGUiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1MTQ3OTYyMzc2IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIgoiVGVzdENvbmZpZ0l0ZW10ZXN0MTQzNTg1Njg5NTE0MTgwMjc3IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIgoiVGVzdENvbmZpZ0l0ZW10ZXN0MTQzNTg1Njg5NTE4MDg3MzMxMCIsIlByb2R1Y3Rpb24iLCJPcGVyYXRpb25hbCIKIlRlc3RDb25maWdJdGVtdGVzdDE0MzU4NTY4OTU1MTM5MjQ0MzkiLCJQcm9kdWN0aW9uIiwiT3BlcmF0aW9uYWwiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1MzAwNzMwMzMiLCJQcm9kdWN0aW9uIiwiT3BlcmF0aW9uYWwiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1NDkzMjczNjg4IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIgoiVGVzdENvbmZpZ0l0ZW10ZXN0MTQzNTg1Njg5NTE4ODIxNjA2NSIsIlByb2R1Y3Rpb24iLCJPcGVyYXRpb25hbCIKIlRlc3RDb25maWdJdGVtdGVzdDE0MzU4NTY4OTU5ODY2OTMzOSIsIlByb2R1Y3Rpb24iLCJPcGVyYXRpb25hbCIKIlRlc3RDb25maWdJdGVtdGVzdDE0MzU4NTY4OTU2MjE5MTAwODYiLCJQcm9kdWN0aW9uIiwiT3BlcmF0aW9uYWwiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1NTQ0MTk2NzI0IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIg==
IyAtLQojIHZhci9wYWNrYWdlc2V0dXAvSW1wb3J0RXhwb3J0LnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIENvcHlyaWdodCAoQykgMjAxMC0yMDE4IE9GT1JLLCBodHRwczovL28tZm9yay5kZQojIC0tCiMgJElkOiBJbXBvcnRFeHBvcnQucG0sdiAxLjEuMS4xIDIwMTgvMTAvMDIgMTU6MTY6MDQgdWQgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJbXBvcnRFeHBvcnQ7ICAgICMjIG5vIGNyaXRpYwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycsCik7Cgo9aGVhZDEgTkFNRQoKdmFyOjpwYWNrYWdlc2V0dXA6OkltcG9ydEV4cG9ydCAtIGNvZGUgdG8gZXhlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb2RlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgndmFyOjpwYWNrYWdlc2V0dXA6OkltcG9ydEV4cG9ydCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGFsd2F5cyBkaXNjYXJkIHRoZSBjb25maWcgb2JqZWN0IGJlZm9yZSBwYWNrYWdlIGNvZGUgaXMgZXhlY3V0ZWQsCiAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBuZXdseSwgc28gdGhhdCBpdAogICAgIyB3aWxsIHVzZSB0aGUgcmVjZW50bHkgd3JpdHRlbiBuZXcgY29uZmlnIGZyb20gdGhlIHBhY2thZ2UKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQ29kZUluc3RhbGwoKQoKUnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVJlaW5zdGFsbCgpCgpSdW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVXBncmFkZSgpCgpSdW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDIuMC4zLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tQmVmb3JlXzJfMF8zIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZml4IGEgdHlwbyBpbiB0aGUgZGF0YWJhc2UKICAgICRTZWxmLT5fRml4RGF0YWJhc2VUeXBvKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzkxKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuOTEuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfOTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzkxIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hhbmdlIGNvbmZpZ3VyYXRpb25zIHRvIG1hdGNoIHRoZSBuZXcgbW9kdWxlIGxvY2F0aW9uLgogICAgJFNlbGYtPl9NaWdyYXRlQ29uZmlncygpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBQUklWQVRFIElOVEVSRkFDRQoKPWhlYWQyIF9GaXhEYXRhYmFzZVR5cG8oKQoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0ZpeERhdGFiYXNlVHlwbygpOwoKPWN1dAoKc3ViIF9GaXhEYXRhYmFzZVR5cG8gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGZpeCB0aGUgQ29sdW1uU2VwZXJhdG9yIHR5cG8gKGNvcnJlY3QgaXMgQ29sdW1uU2VwYXJhdG9yKQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgaW1leHBvcnRfZm9ybWF0ICIKICAgICAgICAgICAgLiAiU0VUIGRhdGFfa2V5ID0gJ0NvbHVtblNlcGFyYXRvcicgIgogICAgICAgICAgICAuICJXSEVSRSBkYXRhX2tleSA9ICdDb2x1bW5TZXBlcmF0b3InIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfTWlncmF0ZUNvbmZpZ3MoKQoKY2hhbmdlIGNvbmZpZ3VyYXRpb25zIHRvIG1hdGNoIHRoZSBuZXcgbW9kdWxlIGxvY2F0aW9uLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X01pZ3JhdGVDb25maWdzKCk7Cgo9Y3V0CgpzdWIgX01pZ3JhdGVDb25maWdzIHsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwoKICAgIG15IEBOZXdTZXR0aW5nczsKCiAgICAjIG1pZ3JhdGUgTmF2QmFyIG1vZHVsZXMKICAgICMgZ2V0IHNldHRpbmcgY29udGVudCBmb3IgTmF2QmFyIG1vZHVsZXMKICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZScpOwoKICAgICMgdXBkYXRlIG1vZHVsZSBsb2NhdGlvbgogICAgJFNldHRpbmctPnsnQWRtaW5JbXBvcnRFeHBvcnQnfS0+e01vZHVsZX0gPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW4iOwoKICAgICMgQnVpbGQgbmV3IHNldHRpbmcuCiAgICBwdXNoIEBOZXdTZXR0aW5ncywgewogICAgICAgIE5hbWUgICAgICAgICAgID0+ICdGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSMjI0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICBFZmZlY3RpdmVWYWx1ZSA9PiAkU2V0dGluZy0+eydBZG1pbkltcG9ydEV4cG9ydCd9LAogICAgfTsKCiAgICAjIFdyaXRlIG5ldyBzZXR0aW5nLgogICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDb21tZW50cyA9PiAnSW1wb3J0RXhwb3J0IC0gcGFja2FnZSBzZXR1cCBmdW5jdGlvbjogX01pZ3JhdGVDb25maWdzJywKICAgICAgICBTZXR0aW5ncyA9PiBcQE5ld1NldHRpbmdzLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPRk9SSyBwcm9qZWN0IChMPGh0dHBzOi8vby1mb3JrLmRlLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxOCBPRk9SSywgaHR0cHM6Ly9vLWZvcmsuZGUKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIElUU00gPSBJVFNNIHx8IHt9OwpJVFNNLkFkbWluID0gSVRTTS5BZG1pbiB8fCB7fTsKCgovKioKICogQG5hbWVzcGFjZSBBZG1pbgogKiBAYXV0aG9yIE9UUlMgQUcKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGJlaGF2aW91cnMgZm9yIElUU00gU2VydmljZSBab29tLgogKi8KIElUU00uQWRtaW4uSW1wb3J0RXhwb3J0ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIEFkbWluLkltcG9ydEV4cG9ydAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhY3Rpb25zIGZvciBJVFNNIFNlcnZpY2UgWm9vbS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgJE5leHRCdXR0b24sICRGaXJzdENvbHVtbjsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnVGVtcGxhdGVFZGl0NCcpKSB7CgogICAgICAgICAgICAvLyBmaW5kIHRoZSBuZXh0IGJ1dHRvbiBhbmQgZ2V0IHRoZSBmaXJzdCBjb2x1bW4gZHJvcGRvd24KICAgICAgICAgICAgJE5leHRCdXR0b24gPSAkKCJidXR0b24uUHJpbWFyeVtuYW1lPSdTdWJtaXROZXh0QnV0dG9uJ10iKS5maXJzdCgpOwogICAgICAgICAgICAkRmlyc3RDb2x1bW4gPSAkKCcjT2JqZWN0XFw6XFw6MFxcOlxcOktleScpOwoKICAgICAgICAgICAgLy8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGZpcnN0IGNvbHVtbiBzZWxlY3RvcgogICAgICAgICAgICAkRmlyc3RDb2x1bW4uYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb2x1bW4gd2l0aCBhIHZhbHVlCiAgICAgICAgICAgICAgICBpZiAoJEZpcnN0Q29sdW1uLnZhbCgpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICAkTmV4dEJ1dHRvbi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICAkTmV4dEJ1dHRvbi5hdHRyKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkudHJpZ2dlcignY2hhbmdlJyk7CgogICAgICAgICAgICAvLyBzZXQgdGhlIGhpZGRlbiBmaWVsZCB0byBkZWxldGUgdGhpcyBjb2x1bW4gYW5kIHN1Ym1pdCB0aGUgZm9ybQogICAgICAgICAgICAkKCcuRGVsZXRlQ29sdW1uJykudW5iaW5kKCdjbGljaycpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ3RkJykuZmluZCgnaW5wdXRbdHlwZT0iaGlkZGVuIl0nKS52YWwoMSk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICQoJyNNYXBwaW5nQWRkQnV0dG9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPU1hcHBpbmdBZGRdJykudmFsKCcxJyk7CiAgICAgICAgICAgICAgICAkKCdpbnB1dFtuYW1lPVN1Ym1pdE5leHRdJykudmFsKCcwJyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgnI1N1Ym1pdE5leHRCdXR0b24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9TWFwcGluZ0FkZF0nKS52YWwoJzAnKTsKICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9U3VibWl0TmV4dF0nKS52YWwoJzEnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdUZW1wbGF0ZU92ZXJ2aWV3JykpIHsKCiAgICAgICAgICAgICQoJ2J1dHRvbi5CYWNrJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgQ29yZS5Db25maWcuR2V0KCdCYWNrVVJMJyk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkFkZE1ldGhvZCgiVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm8iLCBmdW5jdGlvbihWYWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIE51bWJlciA9IHBhcnNlSW50KFZhbHVlLCAxMCk7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4oTnVtYmVyKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkTWV0aG9kKCJWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyIiwgZnVuY3Rpb24oVmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoVmFsdWUubWF0Y2goL15bMC05XSskLykpID8gdHJ1ZSA6IGZhbHNlOwoKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm8iLCB7IFZhbGlkYXRlX051bWJlckJpZ2dlclRoYW5aZXJvOiB0cnVlIH0pOwogICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVySW50ZWdlciIsIHsgVmFsaWRhdGVfTnVtYmVySW50ZWdlcjogdHJ1ZSB9KTsKICAgICAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkFkZFJ1bGUoIlZhbGlkYXRlX051bWJlckludGVnZXJCaWdnZXJUaGFuWmVybyIsIHsgVmFsaWRhdGVfTnVtYmVySW50ZWdlcjogdHJ1ZSwgVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm86IHRydWUgfSk7CgogICAgICAgIH0KCiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oSVRTTS5BZG1pbi5JbXBvcnRFeHBvcnQgfHwge30pKTsK
LyoqCiAqIEBwcm9qZWN0ICAgICBPRk9SSyAoaHR0cHM6Ly9vLWZvcmsuZGUpIC0gQWdlbnQgRnJvbnRlbmQKICogQGNvcHlyaWdodCAgIE9GT1JLCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSW1wb3J0IEV4cG9ydCBTY3JlZW4KICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uCiAqLwoKCi5NYXBIZWFkZXJSb3cgbGFiZWwgewogICAgY29sb3I6ICM5MjkyOTI7Cn0KCi5NYXBIZWFkZXJSb3cgLkhlYWRlciwKLk1hcEhlYWRlclJvdyAuRmllbGQgewogICAgZGlzcGxheTogaW5saW5lOwogICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgcGFkZGluZy1sZWZ0OiAycHg7Cn0KCmJ1dHRvbi5BcnJvd1VwLApidXR0b24uQXJyb3dEb3duIHsKICAgIGhlaWdodDogMTZweDsKICAgIHdpZHRoOiAxNnB4OwogICAgcGFkZGluZzogMXB4OwogICAgbWFyZ2luLXRvcDogMDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKICAgIGJvcmRlci1zdHlsZTogbm9uZTsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uLkFycm93VXA6YWN0aXZlLApidXR0b24uQXJyb3dEb3duOmFjdGl2ZSB7CiAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXTphY3RpdmUsCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl06YWN0aXZlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKfQoKYnV0dG9uLkFycm93VXAgewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXAucG5nKTsKfQoKYnV0dG9uLkFycm93VXBbZGlzYWJsZWQ9ImRpc2FibGVkIl0gewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXBfZGlzYWJsZWQucG5nKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKYnV0dG9uLkFycm93RG93biB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duLnBuZyk7Cn0KCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl17CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duX2Rpc2FibGVkLnBuZyk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
LyoqCiAqIEBwcm9qZWN0ICAgICBPRk9SSyAoaHR0cHM6Ly9vLWZvcmsuZGUpIC0gQWdlbnQgRnJvbnRlbmQKICogQGNvcHlyaWdodCAgIE9GT1JLCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSW1wb3J0IEV4cG9ydCBTY3JlZW4KICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uCiAqLwoKCi5NYXBIZWFkZXJSb3cgbGFiZWwgewogICAgY29sb3I6ICM5MjkyOTI7Cn0KCi5NYXBIZWFkZXJSb3cgLkhlYWRlciwKLk1hcEhlYWRlclJvdyAuRmllbGQgewogICAgZGlzcGxheTogaW5saW5lOwogICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgcGFkZGluZy1sZWZ0OiAycHg7Cn0KCmJ1dHRvbi5BcnJvd1VwLApidXR0b24uQXJyb3dEb3duIHsKICAgIGhlaWdodDogMTZweDsKICAgIHdpZHRoOiAxNnB4OwogICAgcGFkZGluZzogMXB4OwogICAgbWFyZ2luLXRvcDogMDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKICAgIGJvcmRlci1zdHlsZTogbm9uZTsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uLkFycm93VXA6YWN0aXZlLApidXR0b24uQXJyb3dEb3duOmFjdGl2ZSB7CiAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXTphY3RpdmUsCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl06YWN0aXZlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKfQoKYnV0dG9uLkFycm93VXAgewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXAucG5nKTsKfQoKYnV0dG9uLkFycm93VXBbZGlzYWJsZWQ9ImRpc2FibGVkIl0gewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXBfZGlzYWJsZWQucG5nKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKYnV0dG9uLkFycm93RG93biB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duLnBuZyk7Cn0KCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl17CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duX2Rpc2FibGVkLnBuZyk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZlJREFUeNqkUztLA0EQnr3bvEhhI9FC09gJInJiZbAQREHUWhTtbK8ULEWwFVLZaJE/YKWFgn2SQgxBgjYSIoYkEsxxuec6c/FxCXmAGZjbmdmZ7+a1TAgBw5AEQxL3K7OnjxAMhyEQCkEgGARJllfJ7jrOjWWaYBkGmM0mPBzOdAdoIyF2MFD9lkfxmxqYgT/Ysix1fzOukHp59apCq1epgT0QFGya6u56XMnnG0C8vTahkI3u+gJ4wYah7m1NKcWiBrregFqtArlcCTaWxhW66wRpKwEdEjTW5EUmS/riXEzhXMB9upSFdMnzYYwl/KXwjgwOsHEgXBds285oQgYHAQ1dB875PJMkmkz/Jjq2DbqmeXJFDoHDwAMwUI9Eo/0BtHod9EbjVy/zKDgugIkARHSy52uUFroDFM9WgI9NQ2T5qJUBj2AJfwD63QnY73mUznuPkRy022MwcfNsJnlMMtlawYMXadItP8Wst1yhmmz9SVQLBbTRUn0iv1CrfpyZ/zXiiOgYQY72WHDq5QfGuF0B/kNfAgwAlIbWNoRkTzIAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEigB30KkogAAAMpJREFUKM+lkT0OAWEQhp/9ESJKF5FPK1oSCQfYXvvVDuAcCola5w5sKdkL6EQhYv+NYpddSyi8xUwxT2bemTGE7zJ/1LGzNKNBnRrWANJNTEjAvAzkclINtFm+dQAQJ9ZjBWstFIhZlCM9Uh4eQxVpcSqAOKGeqAM+J/b0VfhE8hFRT1i40FEWWxfA6GVjckCmKTeSXcoNH7trYlVNJlwBQQiAZhU4c8k6IfiAT+sVOD52AQJ4xsJk6VrRp1PHWXJXgOGWAePvb94BXKRFykgCmkUAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZBJREFUeNrEU79Lw0AUfpemhZI4CIpCJ92cHE4HJ0HEQcFRQdShIJ0E/5SCOBSkgxZE7CS4iIt06NIMnVxUcKhWCJb+iPl1l/gu1ppKKkIHH1zu3r33ffnu3Tvi+z4MYxIMaXLYWcy/9taEkBxOtOtqqDTzFbtNT0QTeIyFXbq5kgoIzq9rf1PgOk5fsNVyQZTo5/5AgqauQ1JVe75puuB5AI5lfe91OvidiiYwms0gOakogd9ovYPjuuCY5ifYMMC17cEKhDEEGO02yLIMNYsB9wjYSMCwPh7nvx8BK51DzZSjbo5E9biCBBAQoFW6ORpOmegi2nYJEyhNr9EHPOo9qvXAB3V1iY4mAF7OrjS83tLARkJwwbWsbPmoqCkJCXQmwRuPQVyW4Clf1ERM5IQxJNzK6vwWSmcQm1nfxv2Dsb0dyjHcOD4Vf87yu8uCVb2AMKaPAJPEJK5gRF7Y3yCTs7uBsnr1hJUPi7gUd9j2Q6AognEcKRwxMr08FxA83lS6KaLXnxHjRRL8y2v8EGAAqEvNnH+aSSAAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEig6bklNhgAAAMlJREFUKM+lkT0KAjEQhb9IFEE9TToP4BU8gq2exG23FAKCYCmIra25iYL4w/6asVhddlW0cJo3yXy8CS9K+F6NH3N0IVMAVIgBnIwAJlXgVogZGNh8ckgfxzNS9jXgQAeACE8MwLUOnIjpACcyYuBa+uinVc4ZzQVPRI5/XSGhN54cQYhhB+IYVYBkK2ZojkR4+qbNyqltLSixSTBzLRIyNEuXBGJfkhSbBtb16LJwaTmuPBLEZszHoIKmfcvhieR70Ovqnfr7N++lLlCSshf+TwAAAABJRU5ErkJggg==