SHARE
TWEET

Untitled

a guest Jul 21st, 2019 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {
  2.  "cells": [
  3.   {
  4.    "cell_type": "code",
  5.    "execution_count": 1,
  6.    "metadata": {},
  7.    "outputs": [],
  8.    "source": [
  9.     "import numpy as np\n",
  10.     "import requests # library to handle requests\n",
  11.     "from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
  12.     "import pandas as pd\n",
  13.     "# Matplotlib and associated plotting modules\n",
  14.     "import matplotlib.cm as cm\n",
  15.     "import matplotlib.colors as colors\n",
  16.     "\n",
  17.     "# import k-means from clustering stage\n",
  18.     "from sklearn.cluster import KMeans\n",
  19.     "\n",
  20.     "#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
  21.     "import folium # map rendering library\n",
  22.     "\n",
  23.     "import geocoder"
  24.    ]
  25.   },
  26.   {
  27.    "cell_type": "code",
  28.    "execution_count": 2,
  29.    "metadata": {},
  30.    "outputs": [],
  31.    "source": [
  32.     "def get_latlng(postal_code):\n",
  33.     "    # initialize your variable to None\n",
  34.     "    lat_lng_coords = None\n",
  35.     "    # loop until you get the coordinates\n",
  36.     "    while(lat_lng_coords is None):\n",
  37.     "        g = geocoder.arcgis('{}, Toronto, Ontario'.format(postal_code))\n",
  38.     "        lat_lng_coords = g.latlng\n",
  39.     "    return lat_lng_coords\n",
  40.     "    \n",
  41.     "location = get_latlng('M4G')"
  42.    ]
  43.   },
  44.   {
  45.    "cell_type": "code",
  46.    "execution_count": 3,
  47.    "metadata": {},
  48.    "outputs": [
  49.     {
  50.      "data": {
  51.       "text/html": [
  52.        "<div>\n",
  53.        "<style scoped>\n",
  54.        "    .dataframe tbody tr th:only-of-type {\n",
  55.        "        vertical-align: middle;\n",
  56.        "    }\n",
  57.        "\n",
  58.        "    .dataframe tbody tr th {\n",
  59.        "        vertical-align: top;\n",
  60.        "    }\n",
  61.        "\n",
  62.        "    .dataframe thead th {\n",
  63.        "        text-align: right;\n",
  64.        "    }\n",
  65.        "</style>\n",
  66.        "<table border=\"1\" class=\"dataframe\">\n",
  67.        "  <thead>\n",
  68.        "    <tr style=\"text-align: right;\">\n",
  69.        "      <th></th>\n",
  70.        "      <th>Postcode</th>\n",
  71.        "      <th>Borough</th>\n",
  72.        "      <th>Neighbourhood</th>\n",
  73.        "      <th>Latitude</th>\n",
  74.        "      <th>Longitude</th>\n",
  75.        "    </tr>\n",
  76.        "  </thead>\n",
  77.        "  <tbody>\n",
  78.        "    <tr>\n",
  79.        "      <th>0</th>\n",
  80.        "      <td>M1B</td>\n",
  81.        "      <td>Scarborough</td>\n",
  82.        "      <td>Rouge,Malvern</td>\n",
  83.        "      <td>43.811525</td>\n",
  84.        "      <td>-79.195517</td>\n",
  85.        "    </tr>\n",
  86.        "    <tr>\n",
  87.        "      <th>1</th>\n",
  88.        "      <td>M1C</td>\n",
  89.        "      <td>Scarborough</td>\n",
  90.        "      <td>Highland Creek,Rouge Hill,Port Union</td>\n",
  91.        "      <td>43.785730</td>\n",
  92.        "      <td>-79.158750</td>\n",
  93.        "    </tr>\n",
  94.        "    <tr>\n",
  95.        "      <th>2</th>\n",
  96.        "      <td>M1E</td>\n",
  97.        "      <td>Scarborough</td>\n",
  98.        "      <td>Guildwood,Morningside,West Hill</td>\n",
  99.        "      <td>43.765690</td>\n",
  100.        "      <td>-79.175256</td>\n",
  101.        "    </tr>\n",
  102.        "    <tr>\n",
  103.        "      <th>3</th>\n",
  104.        "      <td>M1G</td>\n",
  105.        "      <td>Scarborough</td>\n",
  106.        "      <td>Woburn</td>\n",
  107.        "      <td>43.768359</td>\n",
  108.        "      <td>-79.217590</td>\n",
  109.        "    </tr>\n",
  110.        "    <tr>\n",
  111.        "      <th>4</th>\n",
  112.        "      <td>M1H</td>\n",
  113.        "      <td>Scarborough</td>\n",
  114.        "      <td>Cedarbrae</td>\n",
  115.        "      <td>43.769688</td>\n",
  116.        "      <td>-79.239440</td>\n",
  117.        "    </tr>\n",
  118.        "  </tbody>\n",
  119.        "</table>\n",
  120.        "</div>"
  121.       ],
  122.       "text/plain": [
  123.        "  Postcode      Borough                         Neighbourhood   Latitude  \\\n",
  124.        "0      M1B  Scarborough                         Rouge,Malvern  43.811525   \n",
  125.        "1      M1C  Scarborough  Highland Creek,Rouge Hill,Port Union  43.785730   \n",
  126.        "2      M1E  Scarborough       Guildwood,Morningside,West Hill  43.765690   \n",
  127.        "3      M1G  Scarborough                                Woburn  43.768359   \n",
  128.        "4      M1H  Scarborough                             Cedarbrae  43.769688   \n",
  129.        "\n",
  130.        "   Longitude  \n",
  131.        "0 -79.195517  \n",
  132.        "1 -79.158750  \n",
  133.        "2 -79.175256  \n",
  134.        "3 -79.217590  \n",
  135.        "4 -79.239440  "
  136.       ]
  137.      },
  138.      "execution_count": 3,
  139.      "metadata": {},
  140.      "output_type": "execute_result"
  141.     }
  142.    ],
  143.    "source": [
  144.     "TorontoData  = pd.read_csv('task2.csv')\n",
  145.     "TorontoData .head()"
  146.    ]
  147.   },
  148.   {
  149.    "cell_type": "code",
  150.    "execution_count": 4,
  151.    "metadata": {},
  152.    "outputs": [
  153.     {
  154.      "name": "stdout",
  155.      "output_type": "stream",
  156.      "text": [
  157.       "The dataframe has 11 boroughs and 103 neighborhoods.\n"
  158.      ]
  159.     }
  160.    ],
  161.    "source": [
  162.     "print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n",
  163.     "        len(TorontoData ['Borough'].unique()),\n",
  164.     "        TorontoData .shape[0]\n",
  165.     "    )\n",
  166.     ")"
  167.    ]
  168.   },
  169.   {
  170.    "cell_type": "code",
  171.    "execution_count": 5,
  172.    "metadata": {},
  173.    "outputs": [
  174.     {
  175.      "data": {
  176.       "text/html": [
  177.        "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUsLTc5LjRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzI4MTExZTIxYTczNzRlNjg5MDE1MzFlYzRjNTEzN2Y0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZmNiMjc3ZTliODM0NWYwODRmZmM3YWY2MGY5MTM5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgxMTUyNTAwMDAwMDA3NCwtNzkuMTk1NTE3MjEzOTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yN2MxOThiYWY4MDc0NGRlOTBkMDE3MDA1MDNkMDNkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Yjg0MmY3ZjMyYjA0OGQ3YjI0MmNkOTEwZDRkNDAwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGI4NDJmN2YzMmIwNDhkN2IyNDJjZDkxMGQ0ZDQwMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yN2MxOThiYWY4MDc0NGRlOTBkMDE3MDA1MDNkMDNkYy5zZXRDb250ZW50KGh0bWxfOGI4NDJmN2YzMmIwNDhkN2IyNDJjZDkxMGQ0ZDQwMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGZjYjI3N2U5YjgzNDVmMDg0ZmZjN2FmNjBmOTEzOTQuYmluZFBvcHVwKHBvcHVwXzI3YzE5OGJhZjgwNzQ0ZGU5MGQwMTcwMDUwM2QwM2RjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3YTI2Y2IzYWNlZTQ5ZTlhMTZkMTNiODg1YTkyYzNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg1NzMwMDAwMDAwMDY1LC03OS4xNTg3NDk5OTk5OTk5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjMDkyMDY3Nzc3OTQ3MjQ4N2IxY2UyMTQ2NzQzZTNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhMzYwZTUyN2Q5YTRjMjc4NDI2ZWI3ZWI0ODFkOTExID0gJCgnPGRpdiBpZD0iaHRtbF83YTM2MGU1MjdkOWE0YzI3ODQyNmViN2ViNDgxZDkxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjMDkyMDY3Nzc3OTQ3MjQ4N2IxY2UyMTQ2NzQzZTNlLnNldENvbnRlbnQoaHRtbF83YTM2MGU1MjdkOWE0YzI3ODQyNmViN2ViNDgxZDkxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zN2EyNmNiM2FjZWU0OWU5YTE2ZDEzYjg4NWE5MmMzZS5iaW5kUG9wdXAocG9wdXBfM2MwOTIwNjc3Nzc5NDcyNDg3YjFjZTIxNDY3NDNlM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGMyY2NiM2U5NDhiNGUwMmI4NTgwYjQzMTZlMDliYjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjU2OTAwMDAwMDAwNiwtNzkuMTc1MjU2MDM1OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMTdlMzNiNjhmNzk0NTExOWM3YmIxZDE5NWYwZjJiYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOTFiMjAzYzhhODM0ZGVhYTM4NmU3N2M4MDRmMThhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjkxYjIwM2M4YTgzNGRlYWEzODZlNzdjODA0ZjE4YWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMTdlMzNiNjhmNzk0NTExOWM3YmIxZDE5NWYwZjJiYS5zZXRDb250ZW50KGh0bWxfZjkxYjIwM2M4YTgzNGRlYWEzODZlNzdjODA0ZjE4YWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGMyY2NiM2U5NDhiNGUwMmI4NTgwYjQzMTZlMDliYjQuYmluZFBvcHVwKHBvcHVwX2ExN2UzM2I2OGY3OTQ1MTE5YzdiYjFkMTk1ZjBmMmJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlmODBlMjVhZGQ4NDQ1ZTlhMGNlNDUwMGZhYTg5YzBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzY4MzU5MTIxMDAwMDYsLTc5LjIxNzU4OTk5OTk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2UyMjRkNjcyZTMyNDliMjgzOTIwNWFiNDA0MjVkMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTViZTIyYmM5Yzc2NGZmOWExN2QzOGI5ZDRiOGQzODQgPSAkKCc8ZGl2IGlkPSJodG1sXzU1YmUyMmJjOWM3NjRmZjlhMTdkMzhiOWQ0YjhkMzg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2UyMjRkNjcyZTMyNDliMjgzOTIwNWFiNDA0MjVkMDIuc2V0Q29udGVudChodG1sXzU1YmUyMmJjOWM3NjRmZjlhMTdkMzhiOWQ0YjhkMzg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmODBlMjVhZGQ4NDQ1ZTlhMGNlNDUwMGZhYTg5YzBiLmJpbmRQb3B1cChwb3B1cF83ZTIyNGQ2NzJlMzI0OWIyODM5MjA1YWI0MDQyNWQwMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OWY2YTRhYTgzYzM0YWFkYmEwMTY3ZDBmYjk5MzRlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2OTY4Nzk5OTAwMDAzNCwtNzkuMjM5NDM5OTk5OTk5OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YmFhMWE4YzA2OTk0ZjgxYmM4YThmMWQxNDQ4MmExMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYTU5NmZhNmU5Y2I0NThkYjI0NDNlOGRhYmJhZjU0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWE1OTZmYTZlOWNiNDU4ZGIyNDQzZThkYWJiYWY1NDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YmFhMWE4YzA2OTk0ZjgxYmM4YThmMWQxNDQ4MmExMi5zZXRDb250ZW50KGh0bWxfZWE1OTZmYTZlOWNiNDU4ZGIyNDQzZThkYWJiYWY1NDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDlmNmE0YWE4M2MzNGFhZGJhMDE2N2QwZmI5OTM0ZTIuYmluZFBvcHVwKHBvcHVwXzViYWExYThjMDY5OTRmODFiYzhhOGYxZDE0NDgyYTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhOGY0Zjg2NTk3ZjQxOThhMWU3ZjI4MmNjOTkxZjJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQzMTI1MDAwMDAwMDgsLTc5LjIzMTc0OTczNTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQwZGMwYWIxMWUwNDg5OGI2ZmVjYjVmZGZmZGM5ODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTYyNDAyOTdkNzljNGZmYmE0MzA0MzBkNWZlYTUzZjQgPSAkKCc8ZGl2IGlkPSJodG1sXzE2MjQwMjk3ZDc5YzRmZmJhNDMwNDMwZDVmZWE1M2Y0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjQwZGMwYWIxMWUwNDg5OGI2ZmVjYjVmZGZmZGM5ODIuc2V0Q29udGVudChodG1sXzE2MjQwMjk3ZDc5YzRmZmJhNDMwNDMwZDVmZWE1M2Y0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFhOGY0Zjg2NTk3ZjQxOThhMWU3ZjI4MmNjOTkxZjJiLmJpbmRQb3B1cChwb3B1cF9mNDBkYzBhYjExZTA0ODk4YjZmZWNiNWZkZmZkYzk4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MzQ2NmFjZmYzMzM0ZmU0YmQ3NTg2YTI0NmEzNjM3MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNjI0NDU4NTAwMDA3NCwtNzkuMjYzNjY5OTk5OTk5OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZTEzYzg1M2ZhOWE0YjkyYWU4NzgyNzQ1ZDZkNDFjOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTg3MDFhZDQ4ZGI0Y2NlYjdkMWNmMGY5NzE4ZjU1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmE4NzAxYWQ0OGRiNGNjZWI3ZDFjZjBmOTcxOGY1NWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTEzYzg1M2ZhOWE0YjkyYWU4NzgyNzQ1ZDZkNDFjOC5zZXRDb250ZW50KGh0bWxfYmE4NzAxYWQ0OGRiNGNjZWI3ZDFjZjBmOTcxOGY1NWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTM0NjZhY2ZmMzMzNGZlNGJkNzU4NmEyNDZhMzYzNzIuYmluZFBvcHVwKHBvcHVwXzZlMTNjODUzZmE5YTRiOTJhZTg3ODI3NDVkNmQ0MWM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0YWNiMTkxMDM5YTQ5NmI4OTE4OTkwNzQxOWI3ZTkyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEzMTMzMjExMDAwMDcsLTc5LjI4NTA1NDk5OTk5OTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTI2OWFlYmNkODY2NGRjNWEzYjVkZDIxOGM4NjhhNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmJiYmExNDQ1N2RkNDRkYzk5YzM3YzUxNWE1ZjFjNTIgPSAkKCc8ZGl2IGlkPSJodG1sX2JiYmJhMTQ0NTdkZDQ0ZGM5OWMzN2M1MTVhNWYxYzUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTI2OWFlYmNkODY2NGRjNWEzYjVkZDIxOGM4NjhhNTkuc2V0Q29udGVudChodG1sX2JiYmJhMTQ0NTdkZDQ0ZGM5OWMzN2M1MTVhNWYxYzUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0YWNiMTkxMDM5YTQ5NmI4OTE4OTkwNzQxOWI3ZTkyLmJpbmRQb3B1cChwb3B1cF8xMjY5YWViY2Q4NjY0ZGM1YTNiNWRkMjE4Yzg2OGE1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OGVhYWI4OTllZTE0NzJkOGNiMzBmOTRiMWQ3ZjhkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyMzU3NTAwMDAwMDA0LC03OS4yMzQ5NzYxNzc5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzN2Q5ZGFkY2Q0OTRhYzY5MDQ1MzM4NmE4ZDY5ZTBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhMjFkODhiM2FlYjRlODlhZDk0MjYwODU5ZmYxNTBlID0gJCgnPGRpdiBpZD0iaHRtbF82YTIxZDg4YjNhZWI0ZTg5YWQ5NDI2MDg1OWZmMTUwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzN2Q5ZGFkY2Q0OTRhYzY5MDQ1MzM4NmE4ZDY5ZTBkLnNldENvbnRlbnQoaHRtbF82YTIxZDg4YjNhZWI0ZTg5YWQ5NDI2MDg1OWZmMTUwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OGVhYWI4OTllZTE0NzJkOGNiMzBmOTRiMWQ3ZjhkMy5iaW5kUG9wdXAocG9wdXBfMDM3ZDlkYWRjZDQ5NGFjNjkwNDUzMzg2YThkNjllMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTg4MWFhMzQ4ZDNmNGU0NmI0MzcwMzUxOTI0Y2UwMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTY2NjUwMDAwMDAwNDYsLTc5LjI2MDE2MzMxNTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmIwYTU0Y2QwNjQ0NGExNGFhNmFiNTliZmI1M2Q2OGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNiYWViZTkyZDJlNGU0ODg5NTNhZDVkOGZmYTkwMTAgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjYmFlYmU5MmQyZTRlNDg4OTUzYWQ1ZDhmZmE5MDEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmIwYTU0Y2QwNjQ0NGExNGFhNmFiNTliZmI1M2Q2OGEuc2V0Q29udGVudChodG1sX2ZjYmFlYmU5MmQyZTRlNDg4OTUzYWQ1ZDhmZmE5MDEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4ODFhYTM0OGQzZjRlNDZiNDM3MDM1MTkyNGNlMDMyLmJpbmRQb3B1cChwb3B1cF9mYjBhNTRjZDA2NDQ0YTE0YWE2YWI1OWJmYjUzZDY4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMmIxNzFlMWM1NWU0MjU1YTEyMDZkOGI1ODgwNDE0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1OTk3NTAwMDAwMDA1LC03OS4yNjg5NzQwMjg5OTk5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyNTA1NzExMzRiMTRjOGJhMzY3MzE2MzZhMWI5ZDUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkZDc3MWFhZDY2NjQ2ZTQ5MWRjYzQ5ZGE5OTIyYzc2ID0gJCgnPGRpdiBpZD0iaHRtbF8yZGQ3NzFhYWQ2NjY0NmU0OTFkY2M0OWRhOTkyMmM3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyNTA1NzExMzRiMTRjOGJhMzY3MzE2MzZhMWI5ZDUzLnNldENvbnRlbnQoaHRtbF8yZGQ3NzFhYWQ2NjY0NmU0OTFkY2M0OWRhOTkyMmM3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMmIxNzFlMWM1NWU0MjU1YTEyMDZkOGI1ODgwNDE0NC5iaW5kUG9wdXAocG9wdXBfMTI1MDU3MTEzNGIxNGM4YmEzNjczMTYzNmExYjlkNTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDRhMjE3ZGUxMTU0NDlkNjhmYzg4ODVjMjMxNTk4NmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTA3MTA0NjQwMDAwNywtNzkuMzAwNTU5OTk5OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDIxNGY1ZTBmNGE0MzI1ODcwYjBkYjA2NGI4MDFmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Mzg1YjM0ZjkxNGI0NDE5YWZlOTQxNDQ1MWFkYzE5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTM4NWIzNGY5MTRiNDQxOWFmZTk0MTQ0NTFhZGMxOWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDIxNGY1ZTBmNGE0MzI1ODcwYjBkYjA2NGI4MDFmMi5zZXRDb250ZW50KGh0bWxfOTM4NWIzNGY5MTRiNDQxOWFmZTk0MTQ0NTFhZGMxOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDRhMjE3ZGUxMTU0NDlkNjhmYzg4ODVjMjMxNTk4NmQuYmluZFBvcHVwKHBvcHVwX2Y0MjE0ZjVlMGY0YTQzMjU4NzBiMGRiMDY0YjgwMWYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU2ZWE2MmVlOWFkMzQ5YTQ5ZTFkNjFmYjUzN2YzOTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzkzOTQwMDAwMDAwMDgsLTc5LjI2Nzk4MjgwMDk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODM2MGEzMDI5Yjk4NDc4Y2FlNzNmYzViMTZmNGNmYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQwOWFhMDM1NzllNGQzZjljNzUxZjE0NmI0M2M2ZTEgPSAkKCc8ZGl2IGlkPSJodG1sX2JkMDlhYTAzNTc5ZTRkM2Y5Yzc1MWYxNDZiNDNjNmUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODM2MGEzMDI5Yjk4NDc4Y2FlNzNmYzViMTZmNGNmYzkuc2V0Q29udGVudChodG1sX2JkMDlhYTAzNTc5ZTRkM2Y5Yzc1MWYxNDZiNDNjNmUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU2ZWE2MmVlOWFkMzQ5YTQ5ZTFkNjFmYjUzN2YzOTM5LmJpbmRQb3B1cChwb3B1cF84MzYwYTMwMjliOTg0NzhjYWU3M2ZjNWIxNmY0Y2ZjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMTQzMzIwNzdkOTM0MmQ0YTFiYzY5MGYzNzM0NzM2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4NDcyNTAwMDAwMDA0LC03OS4yOTkwNDY1OTk5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlMTgwOWVjM2ViYzQ0ZWM5MzFmN2E0YTJkOTQ5ZGIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IzZWY4ZTU3MzFlOTRlMmE4Nzg0ZmRiYzdlOThmYmQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9iM2VmOGU1NzMxZTk0ZTJhODc4NGZkYmM3ZTk4ZmJkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlMTgwOWVjM2ViYzQ0ZWM5MzFmN2E0YTJkOTQ5ZGIwLnNldENvbnRlbnQoaHRtbF9iM2VmOGU1NzMxZTk0ZTJhODc4NGZkYmM3ZTk4ZmJkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMTQzMzIwNzdkOTM0MmQ0YTFiYzY5MGYzNzM0NzM2MC5iaW5kUG9wdXAocG9wdXBfMmUxODA5ZWMzZWJjNDRlYzkzMWY3YTRhMmQ5NDlkYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDg0YTQ2MzA4YTI3NDM0OGE0MmEzZTNlNjkwNDNiYjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTc4MTAwMDAwMDAwNjUsLTc5LjI4MDI0MzYyMTk5OTk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDgxYTNjZmRlZDY5NDhiYTljNGQzZDk1MjZjNDk1ODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGE5YWE5OTkxMjJiNDdlM2FiNDY5MjhkMmEwMjFhZWQgPSAkKCc8ZGl2IGlkPSJodG1sXzRhOWFhOTk5MTIyYjQ3ZTNhYjQ2OTI4ZDJhMDIxYWVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDgxYTNjZmRlZDY5NDhiYTljNGQzZDk1MjZjNDk1ODYuc2V0Q29udGVudChodG1sXzRhOWFhOTk5MTIyYjQ3ZTNhYjQ2OTI4ZDJhMDIxYWVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA4NGE0NjMwOGEyNzQzNDhhNDJhM2UzZTY5MDQzYmI3LmJpbmRQb3B1cChwb3B1cF9kODFhM2NmZGVkNjk0OGJhOWM0ZDNkOTUyNmM0OTU4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNjBmZmUxZTJmODM0YzI0YmZhYWVmNTQyOTY3NzJiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwMDg4MDk0OTAwMDAzLC03OS4zMjA3Mzk5OTk5OTk5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyMmI1MWU2Yzc3YTQ5YzI4N2EzNmI4OWQ1Yzk4ZWIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllNThmODliM2M5NTQ5YWM4OGFkN2ZhNGFjZGFjMDJiID0gJCgnPGRpdiBpZD0iaHRtbF85ZTU4Zjg5YjNjOTU0OWFjODhhZDdmYTRhY2RhYzAyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyMmI1MWU2Yzc3YTQ5YzI4N2EzNmI4OWQ1Yzk4ZWIxLnNldENvbnRlbnQoaHRtbF85ZTU4Zjg5YjNjOTU0OWFjODhhZDdmYTRhY2RhYzAyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNjBmZmUxZTJmODM0YzI0YmZhYWVmNTQyOTY3NzJiMS5iaW5kUG9wdXAocG9wdXBfYzIyYjUxZTZjNzdhNDljMjg3YTM2Yjg5ZDVjOThlYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWJkOTdlYzlhZmYxNGYzNmFmMmZkOGZmNzE2NDU5NTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MzQyMTUwMDAwMDAwMywtNzkuMjE2NzAwODUwOTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMmUwZmVmYmU3MjQ0MDBhYjgzM2M3OTMwMDg3ZGVkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xODI5YjBjZWRlZWU0YzEyYWZhYTI3NDUxYjEwNzUyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTgyOWIwY2VkZWVlNGMxMmFmYWEyNzQ1MWIxMDc1MjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMmUwZmVmYmU3MjQ0MDBhYjgzM2M3OTMwMDg3ZGVkNC5zZXRDb250ZW50KGh0bWxfMTgyOWIwY2VkZWVlNGMxMmFmYWEyNzQ1MWIxMDc1MjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWJkOTdlYzlhZmYxNGYzNmFmMmZkOGZmNzE2NDU5NTYuYmluZFBvcHVwKHBvcHVwXzIyZTBmZWZiZTcyNDQwMGFiODMzYzc5MzAwODdkZWQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllMGRkODNlMWY4YjQ2OGFhMGQ2ZWIzMGNlODg0NjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODAyODQ1MDAwMDAwMDUsLTc5LjM1NjIzNjE1MDk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ2MWRmZWYzYTA3YjQwMGY4MzRkYjJhZmM4ODZkZWU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1OTRjNGQwZDRiMTRiNDI4NzhlMzg0ZTA2N2RmMjhlID0gJCgnPGRpdiBpZD0iaHRtbF9mNTk0YzRkMGQ0YjE0YjQyODc4ZTM4NGUwNjdkZjI4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDYxZGZlZjNhMDdiNDAwZjgzNGRiMmFmYzg4NmRlZTYuc2V0Q29udGVudChodG1sX2Y1OTRjNGQwZDRiMTRiNDI4NzhlMzg0ZTA2N2RmMjhlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllMGRkODNlMWY4YjQ2OGFhMGQ2ZWIzMGNlODg0NjFhLmJpbmRQb3B1cChwb3B1cF80NjFkZmVmM2EwN2I0MDBmODM0ZGIyYWZjODg2ZGVlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZGJkZGFlNGZhNTE0ZmU4YjMwNmZkZDZjODg1ODQwYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MDg4MDAwMDAwMDAyLC03OS4zNDc3OTU3NzU5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGJhYzA5NmRjZjU0MjhmODA4YmNiNWJjMDZlYThkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OWJmYjNkZTNhM2M0MTQzYWFhYmNjOGY2MmJmNTkxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTliZmIzZGUzYTNjNDE0M2FhYWJjYzhmNjJiZjU5MTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwYmFjMDk2ZGNmNTQyOGY4MDhiY2I1YmMwNmVhOGQ4LnNldENvbnRlbnQoaHRtbF85OWJmYjNkZTNhM2M0MTQzYWFhYmNjOGY2MmJmNTkxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZGJkZGFlNGZhNTE0ZmU4YjMwNmZkZDZjODg1ODQwYi5iaW5kUG9wdXAocG9wdXBfZTBiYWMwOTZkY2Y1NDI4ZjgwOGJjYjViYzA2ZWE4ZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGRkY2Q3OTI5MWY0NGJkM2IyYmZhYTgzMjVmNTUwNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODEwMTUwMDAwMDAwMiwtNzkuMzgwNTQyNDIxOTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGFkNTM1OTI0NzI3NDg2YmFiODRhYjJlOTJhN2RmZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmQ2NGQ3Zjg4NjFmNGIzZjlmMzcyOWYwMWE3NzU1NzggPSAkKCc8ZGl2IGlkPSJodG1sX2ZkNjRkN2Y4ODYxZjRiM2Y5ZjM3MjlmMDFhNzc1NTc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YWQ1MzU5MjQ3Mjc0ODZiYWI4NGFiMmU5MmE3ZGZlZi5zZXRDb250ZW50KGh0bWxfZmQ2NGQ3Zjg4NjFmNGIzZjlmMzcyOWYwMWE3NzU1NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGRkY2Q3OTI5MWY0NGJkM2IyYmZhYTgzMjVmNTUwNjQuYmluZFBvcHVwKHBvcHVwXzRhZDUzNTkyNDcyNzQ4NmJhYjg0YWIyZTkyYTdkZmVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmNzQyYmM3YmJmYzRiNjVhYzkwMjYyMmM1NDM1ZThlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3MTkyMDAwMDAwMDMsLTc5LjM3OTg2NDk5OTk5OTk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzZjYxNDJjZGQwNDQ0NGQ5NTZiZDcwMjg3NGJmYTNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkYmVkNDlmOGQwOTQwMTZiNTIxMzUwYjUxNzA5NTZhID0gJCgnPGRpdiBpZD0iaHRtbF8wZGJlZDQ5ZjhkMDk0MDE2YjUyMTM1MGI1MTcwOTU2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNmNjE0MmNkZDA0NDQ0ZDk1NmJkNzAyODc0YmZhM2Euc2V0Q29udGVudChodG1sXzBkYmVkNDlmOGQwOTQwMTZiNTIxMzUwYjUxNzA5NTZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmNzQyYmM3YmJmYzRiNjVhYzkwMjYyMmM1NDM1ZThlLmJpbmRQb3B1cChwb3B1cF8zM2Y2MTQyY2RkMDQ0NDRkOTU2YmQ3MDI4NzRiZmEzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTZmNGRkMzE0NzY0YWQ3Yjg0YTFmN2Y5NTVlN2QzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5MTQ3NTAwMDAwMDA1LC03OS40MTM2MDQ4NzI5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODNkZmNiNDg4NzM0YTk5OWFhOTc4YmQxMmEyNGQ2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zM2M5NDgyOGY5MGY0N2Q5YjFlM2Q4Y2Y5MGZmMTdmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzNjOTQ4MjhmOTBmNDdkOWIxZTNkOGNmOTBmZjE3ZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4M2RmY2I0ODg3MzRhOTk5YWE5NzhiZDEyYTI0ZDZlLnNldENvbnRlbnQoaHRtbF8zM2M5NDgyOGY5MGY0N2Q5YjFlM2Q4Y2Y5MGZmMTdmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTZmNGRkMzE0NzY0YWQ3Yjg0YTFmN2Y5NTVlN2QzYS5iaW5kUG9wdXAocG9wdXBfZjgzZGZjYjQ4ODczNGE5OTlhYTk3OGJkMTJhMjRkNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI2MzViODVjYjA2NDA4Zjg2N2E0Y2JjYzJkZTVhNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjgxNjUwMDAwMDAwNywtNzkuNDA3NDE5ODQ1OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTBiOTRkN2VkNDAyNGJkZGI5MTJiMTllYWNhOGU1ZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE3MGI1NmM4ZDg0NGNkOTg1YjI2NTI3NGE5NTllOWMgPSAkKCc8ZGl2IGlkPSJodG1sX2UxNzBiNTZjOGQ4NDRjZDk4NWIyNjUyNzRhOTU5ZTljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MGI5NGQ3ZWQ0MDI0YmRkYjkxMmIxOWVhY2E4ZTVmMy5zZXRDb250ZW50KGh0bWxfZTE3MGI1NmM4ZDg0NGNkOTg1YjI2NTI3NGE5NTllOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGI2MzViODVjYjA2NDA4Zjg2N2E0Y2JjYzJkZTVhNzcuYmluZFBvcHVwKHBvcHVwXzkwYjk0ZDdlZDQwMjRiZGRiOTEyYjE5ZWFjYThlNWYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwOWVlMzQ1ZWQxYzQ1YTNiZjFmYWQ5NzhkZDY5YzQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ3ODU1MDAwMDAwMDY1LC03OS40MDAwNjIyMzc5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OGM1M2Q5MTdiYTE0Y2ZjYTgwOTQ2MjZiZDI4OGQ3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OTA2ZDc1MzQ1NDI0MTJlYjY5YmQ0NjVmMTJmZmRhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTkwNmQ3NTM0NTQyNDEyZWI2OWJkNDY1ZjEyZmZkYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4YzUzZDkxN2JhMTRjZmNhODA5NDYyNmJkMjg4ZDdhLnNldENvbnRlbnQoaHRtbF85OTA2ZDc1MzQ1NDI0MTJlYjY5YmQ0NjVmMTJmZmRhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MDllZTM0NWVkMWM0NWEzYmYxZmFkOTc4ZGQ2OWM0MS5iaW5kUG9wdXAocG9wdXBfNThjNTNkOTE3YmExNGNmY2E4MDk0NjI2YmQyODhkN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQ1ZTdhOGEwMjlkNGNhNjgxNzQ0ZGRhYzExZDdkY2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Nzc2OTUwMDAwMDAwNSwtNzkuNDQ1Nzk2NTcyOTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjZhZGVkNWZkNjhkNDgwNWI3MDdjM2RiNWNhZDc0ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDUyYTNmYTRmYTE3NGYwOTg3Zjk2ZTk1ZDcxNDQ1NTcgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1MmEzZmE0ZmExNzRmMDk4N2Y5NmU5NWQ3MTQ0NTU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNmFkZWQ1ZmQ2OGQ0ODA1YjcwN2MzZGI1Y2FkNzRlYi5zZXRDb250ZW50KGh0bWxfNDUyYTNmYTRmYTE3NGYwOTg3Zjk2ZTk1ZDcxNDQ1NTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQ1ZTdhOGEwMjlkNGNhNjgxNzQ0ZGRhYzExZDdkY2YuYmluZFBvcHVwKHBvcHVwXzI2YWRlZDVmZDY4ZDQ4MDViNzA3YzNkYjVjYWQ3NGViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0M2E0ZTJkMTQxODRkOGE5NGUzMDQ2YWU4NWFhMzEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUyNDQwMDAwMDAwMDM2LC03OS4zMjkyNzA3MjU5OTk5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwZjMzNzM3YmI2MDQyNTM4NzUyYzNlYjlkNTY3ZWQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwYmMwZjAxZWY2OTQyNzY5M2I4NzgzZGQxZDgwNzg4ID0gJCgnPGRpdiBpZD0iaHRtbF8zMGJjMGYwMWVmNjk0Mjc2OTNiODc4M2RkMWQ4MDc4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjBmMzM3MzdiYjYwNDI1Mzg3NTJjM2ViOWQ1NjdlZDYuc2V0Q29udGVudChodG1sXzMwYmMwZjAxZWY2OTQyNzY5M2I4NzgzZGQxZDgwNzg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0M2E0ZTJkMTQxODRkOGE5NGUzMDQ2YWU4NWFhMzEwLmJpbmRQb3B1cChwb3B1cF9iMGYzMzczN2JiNjA0MjUzODc1MmMzZWI5ZDU2N2VkNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MmJmMTQwZWM3ZjQ0YzM2YTY5OTY4MGMxYzZmZTEyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0OTE5NTAwMDAwMDAzNiwtNzkuMzYxOTA1NDE2OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ4MWFkYTVkMmE0NDRlZWJmN2NmMWY4ZGM5ZTI5NWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWIzZjM4YTIxMTgzNDU0MmIyNDdjN2ZhNzNkYzljMjggPSAkKCc8ZGl2IGlkPSJodG1sXzViM2YzOGEyMTE4MzQ1NDJiMjQ3YzdmYTczZGM5YzI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDgxYWRhNWQyYTQ0NGVlYmY3Y2YxZjhkYzllMjk1YS5zZXRDb250ZW50KGh0bWxfNWIzZjM4YTIxMTgzNDU0MmIyNDdjN2ZhNzNkYzljMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTJiZjE0MGVjN2Y0NGMzNmE2OTk2ODBjMWM2ZmUxMmUuYmluZFBvcHVwKHBvcHVwX2FkODFhZGE1ZDJhNDQ0ZWViZjdjZjFmOGRjOWUyOTVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkNzI3ZmFjOWU4MDQyNDE5MzgwNjg2ZDA4ZDQ4NmQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzIxNDI1MDAwMDAwMDcsLTc5LjM0MzQ1Mjc4OTk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZmY5YjgxYmE3OTk0YzgwYmE0ZmFkNTZiZDNmMTkzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWMwM2Y5MDE3YTQ0MDcyODNiODM2ZDI1NjNlODY1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDVjMDNmOTAxN2E0NDA3MjgzYjgzNmQyNTYzZTg2NTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmZjliODFiYTc5OTRjODBiYTRmYWQ1NmJkM2YxOTNhLnNldENvbnRlbnQoaHRtbF8wNWMwM2Y5MDE3YTQ0MDcyODNiODM2ZDI1NjNlODY1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDcyN2ZhYzllODA0MjQxOTM4MDY4NmQwOGQ0ODZkOC5iaW5kUG9wdXAocG9wdXBfNWZmOWI4MWJhNzk5NGM4MGJhNGZhZDU2YmQzZjE5M2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFhMDc3ZDAwNDJhNDgwOWI1NmY0NGVjZTIwMDBlMjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc1NjUwMDAwMDAwNTYsLTc5LjQ0ODE5MDc5Mjk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyOWUxZDUwNjdmMTQyOGY4ZjE0NjI3YWQ3Zjk1MmIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0ZGJiZGVhOTc1MzQzYTJiOTAyNGNlNzVhNjQ0MzZkID0gJCgnPGRpdiBpZD0iaHRtbF9kNGRiYmRlYTk3NTM0M2EyYjkwMjRjZTc1YTY0NDM2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTI5ZTFkNTA2N2YxNDI4ZjhmMTQ2MjdhZDdmOTUyYjEuc2V0Q29udGVudChodG1sX2Q0ZGJiZGVhOTc1MzQzYTJiOTAyNGNlNzVhNjQ0MzZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZhYTA3N2QwMDQyYTQ4MDliNTZmNDRlY2UyMDAwZTIzLmJpbmRQb3B1cChwb3B1cF8xMjllMWQ1MDY3ZjE0MjhmOGYxNDYyN2FkN2Y5NTJiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZWJiMWRhNTM3MjI0NTQ0YjBhNTcwM2VjMDlhYzcwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2NDY2NTAwMDAwMDAzNiwtNzkuNDg3MTgyNjYyOTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzRlZmYzZjFjNWY5NGNiYmI2NmZjMzFiZjRhNTQzNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDRmZjZkN2U1NGRiNGI0MThjMmUyMDU0ZTI5M2VjZWEgPSAkKCc8ZGl2IGlkPSJodG1sXzA0ZmY2ZDdlNTRkYjRiNDE4YzJlMjA1NGUyOTNlY2VhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NGVmZjNmMWM1Zjk0Y2JiYjY2ZmMzMWJmNGE1NDM1OS5zZXRDb250ZW50KGh0bWxfMDRmZjZkN2U1NGRiNGI0MThjMmUyMDU0ZTI5M2VjZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGViYjFkYTUzNzIyNDU0NGIwYTU3MDNlYzA5YWM3MGUuYmluZFBvcHVwKHBvcHVwXzc0ZWZmM2YxYzVmOTRjYmJiNjZmYzMxYmY0YTU0MzU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzOTc2ZGQxNTUyNjQzMDk4Y2E3MjJhODgyZWU5Y2VhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5MDI2MjUwMDAwMDQ1LC03OS40NjczMTk5OTk5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNGE5NzA0NzUxODc0ZjJjYWQ5OTRmNWUwN2E3NDEzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDNjYTUwYWY5NmQ0NmZjODExZGFlZmYyNzJjMDAwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQzY2E1MGFmOTZkNDZmYzgxMWRhZWZmMjcyYzAwMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0YTk3MDQ3NTE4NzRmMmNhZDk5NGY1ZTA3YTc0MTM3LnNldENvbnRlbnQoaHRtbF8wZDNjYTUwYWY5NmQ0NmZjODExZGFlZmYyNzJjMDAwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMzk3NmRkMTU1MjY0MzA5OGNhNzIyYTg4MmVlOWNlYS5iaW5kUG9wdXAocG9wdXBfZjRhOTcwNDc1MTg3NGYyY2FkOTk0ZjVlMDdhNzQxMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWIwNWY5NGI2ZDI4NDFkOTk3ZTk5MGJiY2EyNGFjZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDA4ODUwMDAwMDAwNSwtNzkuNTA1MDI2NTE4OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQxNzRiMTdkYzg3NGYwNTk0ZjM1M2FmYWMxOGRlZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ1MWM1MGJkMTU2NDAzZmFjYTJjMjNiMjdjNGM5OGYgPSAkKCc8ZGl2IGlkPSJodG1sXzFkNTFjNTBiZDE1NjQwM2ZhY2EyYzIzYjI3YzRjOThmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDE3NGIxN2RjODc0ZjA1OTRmMzUzYWZhYzE4ZGVkYS5zZXRDb250ZW50KGh0bWxfMWQ1MWM1MGJkMTU2NDAzZmFjYTJjMjNiMjdjNGM5OGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWIwNWY5NGI2ZDI4NDFkOTk3ZTk5MGJiY2EyNGFjZTguYmluZFBvcHVwKHBvcHVwXzU0MTc0YjE3ZGM4NzRmMDU5NGYzNTNhZmFjMThkZWRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhjZDcxYmMyZTRjZDRlZDA4MzA3YjYzNzMwMGIyZTZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM0NTg1MDAwMDAwMDQsLTc5LjQ5MzE1MDYyNTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkNmJjNTkwMjNjMDQxYzk5NDVjNDQ3Y2YxN2NiZTIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyMWJkOWU0YzZlMTQ0NzI4MzNhYWY0ZjQ5YmRhYmUwID0gJCgnPGRpdiBpZD0iaHRtbF82MjFiZDllNGM2ZTE0NDcyODMzYWFmNGY0OWJkYWJlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWQ2YmM1OTAyM2MwNDFjOTk0NWM0NDdjZjE3Y2JlMjMuc2V0Q29udGVudChodG1sXzYyMWJkOWU0YzZlMTQ0NzI4MzNhYWY0ZjQ5YmRhYmUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhjZDcxYmMyZTRjZDRlZDA4MzA3YjYzNzMwMGIyZTZmLmJpbmRQb3B1cChwb3B1cF9hZDZiYzU5MDIzYzA0MWM5OTQ1YzQ0N2NmMTdjYmUyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODE3NDE0YjEyYjk0OTZmYjY2NWY0NTBmODE3MmE5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NTMzMDYwMTAwMDAyNiwtNzkuNTE5NTg5OTk5OTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU2MTk2OTNiZjQyNDU0MjkxZGJiODI5MzFiNWY2OTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U3MjYzMzMzNjViNGRhMGFiN2UxYTk5NDAwMzE3ZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzNlNzI2MzMzMzY1YjRkYTBhYjdlMWE5OTQwMDMxN2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTYxOTY5M2JmNDI0NTQyOTFkYmI4MjkzMWI1ZjY5NS5zZXRDb250ZW50KGh0bWxfM2U3MjYzMzMzNjViNGRhMGFiN2UxYTk5NDAwMzE3ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTgxNzQxNGIxMmI5NDk2ZmI2NjVmNDUwZjgxNzJhOTkuYmluZFBvcHVwKHBvcHVwX2M1NjE5NjkzYmY0MjQ1NDI5MWRiYjgyOTMxYjVmNjk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiZDRhMTk1OGU1NTRkMmRhMTU1M2I4MDNiNmQ3YTNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzMwNDIwNTc3MDAwMDc1LC03OS4zMTMzMTk5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhOTViNTdmYzAwMDQ5MDdiYzI5NGUwODQ2ZWNmOTE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5ZDI1ODdjNWJjMzQzOTc5ZjMzZGM2MzM2MTZmNTk4ID0gJCgnPGRpdiBpZD0iaHRtbF9iOWQyNTg3YzViYzM0Mzk3OWYzM2RjNjMzNjE2ZjU5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGE5NWI1N2ZjMDAwNDkwN2JjMjk0ZTA4NDZlY2Y5MTUuc2V0Q29udGVudChodG1sX2I5ZDI1ODdjNWJjMzQzOTc5ZjMzZGM2MzM2MTZmNTk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiZDRhMTk1OGU1NTRkMmRhMTU1M2I4MDNiNmQ3YTNkLmJpbmRQb3B1cChwb3B1cF80YTk1YjU3ZmMwMDA0OTA3YmMyOTRlMDg0NmVjZjkxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOWM4N2ZhNDE2NWM0ODlmYjJjNTM3ODQ3ZmZlYTZmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNzUzNTAwMDAwMDA2NCwtNzkuMzExNzczMjk2OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MGM4ZjYwOWQ0ZDI0NDY5YWI1NTE0NzcyMjVjZDQ1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZGY2MzdjNmIyMTg0OWMxYjVmZWE2YjM2NDE2OGY1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2RmNjM3YzZiMjE4NDljMWI1ZmVhNmIzNjQxNjhmNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDBjOGY2MDlkNGQyNDQ2OWFiNTUxNDc3MjI1Y2Q0NWQuc2V0Q29udGVudChodG1sXzNkZjYzN2M2YjIxODQ5YzFiNWZlYTZiMzY0MTY4ZjU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5Yzg3ZmE0MTY1YzQ4OWZiMmM1Mzc4NDdmZmVhNmY2LmJpbmRQb3B1cChwb3B1cF80MGM4ZjYwOWQ0ZDI0NDY5YWI1NTE0NzcyMjVjZDQ1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZTNlYWQyYzlkMzk0ODEwYTllNWUxMDQxNDcxNDMwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTY2NTAwMDAwMDA1LC03OS4zMDcxNjkxMDk5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzc2NzA2MGYxODEyNDE2YjkzYTcyNzMxYWNmYjBiNzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzY0MzkyM2ZhNGY2NDZjZTkxMzNkMjRlNGI4ZGMyYTMgPSAkKCc8ZGl2IGlkPSJodG1sX2M2NDM5MjNmYTRmNjQ2Y2U5MTMzZDI0ZTRiOGRjMmEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3NjcwNjBmMTgxMjQxNmI5M2E3MjczMWFjZmIwYjc1LnNldENvbnRlbnQoaHRtbF9jNjQzOTIzZmE0ZjY0NmNlOTEzM2QyNGU0YjhkYzJhMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZTNlYWQyYzlkMzk0ODEwYTllNWUxMDQxNDcxNDMwMC5iaW5kUG9wdXAocG9wdXBfMzc2NzA2MGYxODEyNDE2YjkzYTcyNzMxYWNmYjBiNzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODRkNTk2MDM1MWZkNGE5YWE0YjgzM2UzY2VjZTgyOWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzY4NDUxODMwMDAwNywtNzkuMjk1MjI0OTk5OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0ZDYzYzAzNDZiYjQ1MWQ4MzM5YmExMWQ3YTRjNmY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5MGU5OGYzZjNhODRhNjM4MDA2ODU1MGYwNzc2MTNhID0gJCgnPGRpdiBpZD0iaHRtbF8zOTBlOThmM2YzYTg0YTYzODAwNjg1NTBmMDc3NjEzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNGQ2M2MwMzQ2YmI0NTFkODMzOWJhMTFkN2E0YzZmOS5zZXRDb250ZW50KGh0bWxfMzkwZTk4ZjNmM2E4NGE2MzgwMDY4NTUwZjA3NzYxM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODRkNTk2MDM1MWZkNGE5YWE0YjgzM2UzY2VjZTgyOWQuYmluZFBvcHVwKHBvcHVwX2E0ZDYzYzAzNDZiYjQ1MWQ4MzM5YmExMWQ3YTRjNmY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkOGE3YzczNjA5YzQ5ZDZhYWYwMjczOWE1Y2FkYjMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5NzY1MDAwMDAwMDcsLTc5LjM2MzkwMDkwODk5OTk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OTE5MmE2ZTJiOTU0MDhhYWEzNTg2MDM3MzYyOGY3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNThhY2QwZmEwNzc0NGYwYWRjODM4NGRhMTJhMTk3MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjU4YWNkMGZhMDc3NDRmMGFkYzgzODRkYTEyYTE5NzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTkxOTJhNmUyYjk1NDA4YWFhMzU4NjAzNzM2MjhmN2Iuc2V0Q29udGVudChodG1sX2Y1OGFjZDBmYTA3NzQ0ZjBhZGM4Mzg0ZGExMmExOTczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkOGE3YzczNjA5YzQ5ZDZhYWYwMjczOWE1Y2FkYjMzLmJpbmRQb3B1cChwb3B1cF81OTE5MmE2ZTJiOTU0MDhhYWEzNTg2MDM3MzYyOGY3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYzZmY2Y2YmY2ZGU0MmRmYjQ2NWM4MzYzYTdjMTBlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwMTI3MDAwMDAwMDA4LC03OS4zNDk4NDQwMTc5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZkNjcxNzM4MDY0NDg4MmFiYTRhMDM4MDkwMTFiYzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQ5NzIwZjdlY2U5NDY0NGFkZDU0N2FjY2ViZjM2ZTIgPSAkKCc8ZGl2IGlkPSJodG1sXzBkOTcyMGY3ZWNlOTQ2NDRhZGQ1NDdhY2NlYmYzNmUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmZDY3MTczODA2NDQ4ODJhYmE0YTAzODA5MDExYmM0LnNldENvbnRlbnQoaHRtbF8wZDk3MjBmN2VjZTk0NjQ0YWRkNTQ3YWNjZWJmMzZlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzZmY2Y2YmY2ZGU0MmRmYjQ2NWM4MzYzYTdjMTBlMi5iaW5kUG9wdXAocG9wdXBfYmZkNjcxNzM4MDY0NDg4MmFiYTRhMDM4MDkwMTFiYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmRkZDQ2Yjg0YjE1NDVmMDg4YzcyYTZkNjQ5YmViYjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODg3NjUzNDQwMDAwNDYsLTc5LjMzNDE3NDk5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzU2ZWU4ZDM4OWQ0ZjEyODgxZmI4MzRlNTJkZWM3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzNkOTQ4YmY1ZjA0ZDNjYmNhNWUzYTNkYmQyZmM2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGMzZDk0OGJmNWYwNGQzY2JjYTVlM2EzZGJkMmZjNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDc1NmVlOGQzODlkNGYxMjg4MWZiODM0ZTUyZGVjNzkuc2V0Q29udGVudChodG1sX2RjM2Q5NDhiZjVmMDRkM2NiY2E1ZTNhM2RiZDJmYzZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZkZGQ0NmI4NGIxNTQ1ZjA4OGM3MmE2ZDY0OWJlYmIyLmJpbmRQb3B1cChwb3B1cF8wNzU2ZWU4ZDM4OWQ0ZjEyODgxZmI4MzRlNTJkZWM3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzdjNjVjYjMxMTM0NTEwODc1ODYzYjJmYmZkZDg0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4MzI2MTUwMDAwMDA2NCwtNzkuMzU1MTE5OTk5OTk5OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjZWM5NWQwMzkyYTQ1YjBhY2FkM2M0NmVkYWE3OWZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMWJkZDljNzg3MjQ1N2E5ZjBhNTQ5MTY0YTAzZDk5ID0gJCgnPGRpdiBpZD0iaHRtbF9mYzFiZGQ5Yzc4NzI0NTdhOWYwYTU0OTE2NGEwM2Q5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kY2VjOTVkMDM5MmE0NWIwYWNhZDNjNDZlZGFhNzlmYy5zZXRDb250ZW50KGh0bWxfZmMxYmRkOWM3ODcyNDU3YTlmMGE1NDkxNjRhMDNkOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTc3YzY1Y2IzMTEzNDUxMDg3NTg2M2IyZmJmZGQ4NGYuYmluZFBvcHVwKHBvcHVwX2RjZWM5NWQwMzkyYTQ1YjBhY2FkM2M0NmVkYWE3OWZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjOTVmNWNlNmMwOTQ2OWY4Y2I3YjU4YmM5ZWE4Mzc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3OTY1MDAwMDAwMDQsLTc5LjMxNDY3MjUxMDk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MGNjOGNiZDE5NzU0ZjQ3YjE1MDc4ZTRmYThlNjdiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZWM5OGM4ZGYzN2U0ZDY2OTViNmU5N2FkNWI3NDUxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2VjOThjOGRmMzdlNGQ2Njk1YjZlOTdhZDViNzQ1MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTBjYzhjYmQxOTc1NGY0N2IxNTA3OGU0ZmE4ZTY3YmMuc2V0Q29udGVudChodG1sX2NlYzk4YzhkZjM3ZTRkNjY5NWI2ZTk3YWQ1Yjc0NTEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjOTVmNWNlNmMwOTQ2OWY4Y2I3YjU4YmM5ZWE4Mzc2LmJpbmRQb3B1cChwb3B1cF81MGNjOGNiZDE5NzU0ZjQ3YjE1MDc4ZTRmYThlNjdiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYmExZTU0NDE3ODM0YTY2YWE5NzM2Yjk5NGY0NWZlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Mjc2NTY1MjAwMDA3NiwtNzkuMzM0ODI5OTk5OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3N2E1ODk0ZTQ3ZTRmNzM4MWMwNzllYmQzN2M0MjllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjMTRjMGU2OTg2YTQ0NTc4MjNhMzNjOTJlNWM3ZWUwID0gJCgnPGRpdiBpZD0iaHRtbF8zYzE0YzBlNjk4NmE0NDU3ODIzYTMzYzkyZTVjN2VlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzdhNTg5NGU0N2U0ZjczODFjMDc5ZWJkMzdjNDI5ZS5zZXRDb250ZW50KGh0bWxfM2MxNGMwZTY5ODZhNDQ1NzgyM2EzM2M5MmU1YzdlZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmJhMWU1NDQxNzgzNGE2NmFhOTczNmI5OTRmNDVmZTIuYmluZFBvcHVwKHBvcHVwX2Y3N2E1ODk0ZTQ3ZTRmNzM4MWMwNzllYmQzN2M0MjllKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiMWFhY2FjOTY3NDRlYjFiMTVlY2VkN2Q5N2E2ZWI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4MTYwMDAwMDAwMDcsLTc5LjM4NzA4NTE4Nzk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY1MTE5ZDVkNmRlZjQ3ZjU4YjkzOGIzZTNjOTFkYmZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1MzhlNzlhMDBhYTQ5NmFiNGI3YzRlOTU3ZjgzZTIwID0gJCgnPGRpdiBpZD0iaHRtbF9mNTM4ZTc5YTAwYWE0OTZhYjRiN2M0ZTk1N2Y4M2UyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTExOWQ1ZDZkZWY0N2Y1OGI5MzhiM2UzYzkxZGJmZC5zZXRDb250ZW50KGh0bWxfZjUzOGU3OWEwMGFhNDk2YWI0YjdjNGU5NTdmODNlMjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2IxYWFjYWM5Njc0NGViMWIxNWVjZWQ3ZDk3YTZlYjcuYmluZFBvcHVwKHBvcHVwXzY1MTE5ZDVkNmRlZjQ3ZjU4YjkzOGIzZTNjOTFkYmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0Y2I2ZTAyNDliMzQwZWRiYTliYWFjNTNlYWFmZGM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEyODE1MDAwMDAwMDM1LC03OS4zODg1MjU4MjE5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZDMzNWJlM2RkMzM0MmI4YTE2YzcxZmJlYzgzY2UxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTJmZTViNDAyNDg0ODNhYjVkNjRjMTkyM2ZjMTQ5OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTUyZmU1YjQwMjQ4NDgzYWI1ZDY0YzE5MjNmYzE0OTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQzMzViZTNkZDMzNDJiOGExNmM3MWZiZWM4M2NlMTkuc2V0Q29udGVudChodG1sX2U1MmZlNWI0MDI0ODQ4M2FiNWQ2NGMxOTIzZmMxNDk5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0Y2I2ZTAyNDliMzQwZWRiYTliYWFjNTNlYWFmZGM2LmJpbmRQb3B1cChwb3B1cF9lZDMzNWJlM2RkMzM0MmI4YTE2YzcxZmJlYzgzY2UxOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYzcxZWE0MzVmNmE0ZDhmYjVjZTFiY2VhNjJkZTAwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxNDUyMjc4NDAwMDA0NiwtNzkuNDA2OTU5OTk5OTk5OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGM2YTUxZTU5ZmRjNDBiZDk3NTFiMTZkNDFiMmIyM2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzQ2YmUxZTE3YzIwNGFmMGI5YThiNjU4MDRjNzM0MGUgPSAkKCc8ZGl2IGlkPSJodG1sXzc0NmJlMWUxN2MyMDRhZjBiOWE4YjY1ODA0YzczNDBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjNmE1MWU1OWZkYzQwYmQ5NzUxYjE2ZDQxYjJiMjNiLnNldENvbnRlbnQoaHRtbF83NDZiZTFlMTdjMjA0YWYwYjlhOGI2NTgwNGM3MzQwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYzcxZWE0MzVmNmE0ZDhmYjVjZTFiY2VhNjJkZTAwOS5iaW5kUG9wdXAocG9wdXBfNGM2YTUxZTU5ZmRjNDBiZDk3NTFiMTZkNDFiMmIyM2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTBiMjA3NjE0ZTc5NGQ3ZmE5MjZiMDE4N2RjZTNhOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDMzOTUwMDAwMDAwNjQsLTc5LjM4NTk2MzYwNDk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjI2ZTRhYjU4NGE0MDQ2OTg4YmNiNmM0ZWE2NDM1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZmJlNzk0OGFkYzY0NTVmYTcxMjk1MDY3NDdlMjBlNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWZiZTc5NDhhZGM2NDU1ZmE3MTI5NTA2NzQ3ZTIwZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWIyNmU0YWI1ODRhNDA0Njk4OGJjYjZjNGVhNjQzNWIuc2V0Q29udGVudChodG1sX2VmYmU3OTQ4YWRjNjQ1NWZhNzEyOTUwNjc0N2UyMGU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwYjIwNzYxNGU3OTRkN2ZhOTI2YjAxODdkY2UzYThkLmJpbmRQb3B1cChwb3B1cF85YjI2ZTRhYjU4NGE0MDQ2OTg4YmNiNmM0ZWE2NDM1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMzM1MmI0YTlmYTY0MzhkOTNmZTViYTg0ODM0ZjBhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5MDY1NTAwMDAwMDA1LC03OS4zODM1NjE0NTc5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDEzNDM3MTgxNDg4NDBjMjgzN2JkN2UxZjQ0ZTA3NTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTNlZjY1ODA1MTc0NDNhZDhkOTczNTI4NzE5NjRjMzMgPSAkKCc8ZGl2IGlkPSJodG1sX2UzZWY2NTgwNTE3NDQzYWQ4ZDk3MzUyODcxOTY0YzMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxMzQzNzE4MTQ4ODQwYzI4MzdiZDdlMWY0NGUwNzU4LnNldENvbnRlbnQoaHRtbF9lM2VmNjU4MDUxNzQ0M2FkOGQ5NzM1Mjg3MTk2NGMzMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzM1MmI0YTlmYTY0MzhkOTNmZTViYTg0ODM0ZjBhZS5iaW5kUG9wdXAocG9wdXBfMDEzNDM3MTgxNDg4NDBjMjgzN2JkN2UxZjQ0ZTA3NTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTEwMDFjYTgwOWJlNDZhM2E4ZTVlYTQzMzk3ZjAxNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODYwODI4NTQwMDAwNiwtNzkuNDAyMzM0OTk5OTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjNGQzOGMzMzQyNDQzZjc4NGNiZDRiNjU0MDE4MjQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkMzUxMjBmYzBhZjQwZWZiYzgwNGQ4NDc3NjY1ZGNlID0gJCgnPGRpdiBpZD0iaHRtbF84ZDM1MTIwZmMwYWY0MGVmYmM4MDRkODQ3NzY2NWRjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzRkMzhjMzM0MjQ0M2Y3ODRjYmQ0YjY1NDAxODI0Ni5zZXRDb250ZW50KGh0bWxfOGQzNTEyMGZjMGFmNDBlZmJjODA0ZDg0Nzc2NjVkY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTEwMDFjYTgwOWJlNDZhM2E4ZTVlYTQzMzk3ZjAxNWYuYmluZFBvcHVwKHBvcHVwX2VjNGQzOGMzMzQyNDQzZjc4NGNiZDRiNjU0MDE4MjQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyYWJkN2JhMDE5OTQzMmI5NDI2OTYzMGY3MmM2NWI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjgxOTQwMDAwMDAwMDUsLTc5LjM3ODQ3NDE2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDEwZDk1NDRlZTVmNDcwMjliNDJmZDgyNWUwMjI5ZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY0ZGRjNzM1MGE2NGJlZThlYjc5OGQ2YzQyOWJkZjEgPSAkKCc8ZGl2IGlkPSJodG1sX2JmNGRkYzczNTBhNjRiZWU4ZWI3OThkNmM0MjliZGYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTBkOTU0NGVlNWY0NzAyOWI0MmZkODI1ZTAyMjllMS5zZXRDb250ZW50KGh0bWxfYmY0ZGRjNzM1MGE2NGJlZThlYjc5OGQ2YzQyOWJkZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODJhYmQ3YmEwMTk5NDMyYjk0MjY5NjMwZjcyYzY1YjguYmluZFBvcHVwKHBvcHVwXzAxMGQ5NTQ0ZWU1ZjQ3MDI5YjQyZmQ4MjVlMDIyOWUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmNjdkZjFmZGIxYTRiNzhiYTI5MzAzNjczOGE0YTM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY4MTYwMDAwMDAwMDY0LC03OS4zNjY2MDIzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExYmMyNDZiZTg5NjRiYjBhZDYyODVhOWY1NmYyMDI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkNjQ3NDYxOTUzYzQzNTQ4YmVkYzI2MGIwNGNkY2ZlID0gJCgnPGRpdiBpZD0iaHRtbF83ZDY0NzQ2MTk1M2M0MzU0OGJlZGMyNjBiMDRjZGNmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTFiYzI0NmJlODk2NGJiMGFkNjI4NWE5ZjU2ZjIwMjcuc2V0Q29udGVudChodG1sXzdkNjQ3NDYxOTUzYzQzNTQ4YmVkYzI2MGIwNGNkY2ZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBmNjdkZjFmZGIxYTRiNzhiYTI5MzAzNjczOGE0YTM0LmJpbmRQb3B1cChwb3B1cF8xMWJjMjQ2YmU4OTY0YmIwYWQ2Mjg1YTlmNTZmMjAyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNWE0MGJhYTgwMGE0MTZiYjcyZTA0MGYwYzIxMTYxYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2NjU4NTAwMDAwMDA1NSwtNzkuMzgxMzAyMDM2OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMDY4ZDc4NmFlNDQ5MTRhZjAwMGM0ODVkMGM4MWQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2Zjk1ZDAzMmE1NDQxNGNhY2JhMDU2NDA5M2MzYjQ1ID0gJCgnPGRpdiBpZD0iaHRtbF81NmY5NWQwMzJhNTQ0MTRjYWNiYTA1NjQwOTNjM2I0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGYwNjhkNzg2YWU0NDkxNGFmMDAwYzQ4NWQwYzgxZDIuc2V0Q29udGVudChodG1sXzU2Zjk1ZDAzMmE1NDQxNGNhY2JhMDU2NDA5M2MzYjQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1YTQwYmFhODAwYTQxNmJiNzJlMDQwZjBjMjExNjFjLmJpbmRQb3B1cChwb3B1cF84ZjA2OGQ3ODZhZTQ0OTE0YWYwMDBjNDg1ZDBjODFkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YmIwNWFlNWFiYTc0YjhiYTY1ZGRjYzdhODMyMDE3ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NTEyMDAwMDAwMDA3LC03OS4zNjI2Mzk3OTY5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDc0NjYwNTc0MGFjNDI3MjgxN2RiM2YyNTg0MTI5N2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmZiYjliNDBiNGRmNGJlNmJmMzQ3ZjkzMTY2MWE1NWEgPSAkKCc8ZGl2IGlkPSJodG1sXzZmYmI5YjQwYjRkZjRiZTZiZjM0N2Y5MzE2NjFhNTVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzQ2NjA1NzQwYWM0MjcyODE3ZGIzZjI1ODQxMjk3Yi5zZXRDb250ZW50KGh0bWxfNmZiYjliNDBiNGRmNGJlNmJmMzQ3ZjkzMTY2MWE1NWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGJiMDVhZTVhYmE3NGI4YmE2NWRkY2M3YTgzMjAxN2YuYmluZFBvcHVwKHBvcHVwXzA3NDY2MDU3NDBhYzQyNzI4MTdkYjNmMjU4NDEyOTdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyMmVhOGVjNDUyODQ1ODQ4MTMwMGQxOTFjYmI4NDJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3MzYzMDExMDAwMDMsLTc5LjM3ODE3OTk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMGViZWVhZTA2NmY0MTA5YWY4MmJhNGE5ZmVhY2M0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYzY5Mzc3M2I0ZGM0NTdmOGZmMjQ3NzFlMTMyOGQ3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmM2OTM3NzNiNGRjNDU3ZjhmZjI0NzcxZTEzMjhkNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwZWJlZWFlMDY2ZjQxMDlhZjgyYmE0YTlmZWFjYzQyLnNldENvbnRlbnQoaHRtbF9mYzY5Mzc3M2I0ZGM0NTdmOGZmMjQ3NzFlMTMyOGQ3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMjJlYThlYzQ1Mjg0NTg0ODEzMDBkMTkxY2JiODQyZC5iaW5kUG9wdXAocG9wdXBfMjBlYmVlYWUwNjZmNDEwOWFmODJiYTRhOWZlYWNjNDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTI0MWE1ZWVkODRlNDYyMzlkZmUyZjdmMjAyY2ZkNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTEyMTAwMDAwMDAwNSwtNzkuMzc1NDgwNTc2OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjOTdkYjA2OTc1NDQxZmRiZTZkZWU5MmRkYjI4MTUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxY2U1ZDY1Mjk2OTQ1OGE4Yzc0MGEyZDBlYjA2NjRmID0gJCgnPGRpdiBpZD0iaHRtbF9lMWNlNWQ2NTI5Njk0NThhOGM3NDBhMmQwZWIwNjY0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmM5N2RiMDY5NzU0NDFmZGJlNmRlZTkyZGRiMjgxNTIuc2V0Q29udGVudChodG1sX2UxY2U1ZDY1Mjk2OTQ1OGE4Yzc0MGEyZDBlYjA2NjRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyNDFhNWVlZDg0ZTQ2MjM5ZGZlMmY3ZjIwMmNmZDU3LmJpbmRQb3B1cChwb3B1cF8yYzk3ZGIwNjk3NTQ0MWZkYmU2ZGVlOTJkZGIyODE1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTMzNWQ2OTJjMDY0NjhkOTg4MWRjZTJmMDM0OWZhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NTE2MDE1NjAwMDAzLC03OS4zNzM2NzQ5OTk5OTk5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBiOTQ2NjBlYmMzNGM3YTlhODZkNTRlNjcyYTI5YWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTJlZjA1MzY5YmE4NDRiOGJmYTU3MjcwYmQ2Njc2ZDkgPSAkKCc8ZGl2IGlkPSJodG1sX2UyZWYwNTM2OWJhODQ0YjhiZmE1NzI3MGJkNjY3NmQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MGI5NDY2MGViYzM0YzdhOWE4NmQ1NGU2NzJhMjlhZC5zZXRDb250ZW50KGh0bWxfZTJlZjA1MzY5YmE4NDRiOGJmYTU3MjcwYmQ2Njc2ZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTEzMzVkNjkyYzA2NDY4ZDk4ODFkY2UyZjAzNDlmYWMuYmluZFBvcHVwKHBvcHVwXzgwYjk0NjYwZWJjMzRjN2E5YTg2ZDU0ZTY3MmEyOWFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2ODcxZTAxZTA0ZTQ0YWY5ZmM1NDA3Y2M4YmMwZGNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU2MDkwODEzMDAwMDUsLTc5LjM4NDkyOTk5OTk5OTk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMGYyOWRkMWIxODg0MWE0OWY3YzI3NDhmZjhlNWQ3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmM1OTc4YWQ5ZWI0YmViOWY5YTY1MjY4MTA2Y2NmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJjNTk3OGFkOWViNGJlYjlmOWE2NTI2ODEwNmNjZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwZjI5ZGQxYjE4ODQxYTQ5ZjdjMjc0OGZmOGU1ZDdhLnNldENvbnRlbnQoaHRtbF9kYmM1OTc4YWQ5ZWI0YmViOWY5YTY1MjY4MTA2Y2NmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNjg3MWUwMWUwNGU0NGFmOWZjNTQwN2NjOGJjMGRjZi5iaW5kUG9wdXAocG9wdXBfMDBmMjlkZDFiMTg4NDFhNDlmN2MyNzQ4ZmY4ZTVkN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2VlZDVkNWI1ZDkwNDU4MWEwNzkzMDI0OWE3NGMwNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDk1MTUwMDAwMDAwNjUsLTc5LjM4MjUwMzQ0Njk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NGUxODYyYjRmNTk0NzE3OTI4MzQ5MjJmNjY4NDEyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMjgwMTlmZmY4MWE0ZjU3YmEyOGIwYjU5MTFhZTlhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjI4MDE5ZmZmODFhNGY1N2JhMjhiMGI1OTExYWU5YTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0ZTE4NjJiNGY1OTQ3MTc5MjgzNDkyMmY2Njg0MTJkLnNldENvbnRlbnQoaHRtbF9mMjgwMTlmZmY4MWE0ZjU3YmEyOGIwYjU5MTFhZTlhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZWVkNWQ1YjVkOTA0NTgxYTA3OTMwMjQ5YTc0YzA1Ny5iaW5kUG9wdXAocG9wdXBfNjRlMTg2MmI0ZjU5NDcxNzkyODM0OTIyZjY2ODQxMmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDcwMTg0ZGM2MTA2NDY5OWJlOTJlN2I5YmJlNzhlMDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MjM0NzAwMDAwMDAwNSwtNzkuMzkxNTA3MzYzOTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhN2MyYmY5MGY0NzQ4NjVhYWZkOWNkZTgzMzBhMDM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0NTI4NjllNGM5MDQxODI5MmFkN2Y3Y2UyN2FmMDEzID0gJCgnPGRpdiBpZD0iaHRtbF80NDUyODY5ZTRjOTA0MTgyOTJhZDdmN2NlMjdhZjAxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWE3YzJiZjkwZjQ3NDg2NWFhZmQ5Y2RlODMzMGEwMzYuc2V0Q29udGVudChodG1sXzQ0NTI4NjllNGM5MDQxODI5MmFkN2Y3Y2UyN2FmMDEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3MDE4NGRjNjEwNjQ2OTliZTkyZTdiOWJiZTc4ZTAzLmJpbmRQb3B1cChwb3B1cF8xYTdjMmJmOTBmNDc0ODY1YWFmZDljZGU4MzMwYTAzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YmM5YmM5MzBhYTM0YTVjYTYxNzU5NGYxOGEyNGI3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzEwMDAwMDAwMDA3LC03OS4zODE1MzEwOTg5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJhNjA0NDEwOWFhNDM0NDllZjgxZWI4NzA1Yjk0MmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTRkYzFlNTE5NTQyNDZkNTk3ZGQ2NWZjODYzMmQ5MTggPSAkKCc8ZGl2IGlkPSJodG1sX2E0ZGMxZTUxOTU0MjQ2ZDU5N2RkNjVmYzg2MzJkOTE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmE2MDQ0MTA5YWE0MzQ0OWVmODFlYjg3MDViOTQyZC5zZXRDb250ZW50KGh0bWxfYTRkYzFlNTE5NTQyNDZkNTk3ZGQ2NWZjODYzMmQ5MTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGJjOWJjOTMwYWEzNGE1Y2E2MTc1OTRmMThhMjRiNzkuYmluZFBvcHVwKHBvcHVwXzYyYTYwNDQxMDlhYTQzNDQ5ZWY4MWViODcwNWI5NDJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlNjk2ZTc2NTg0NzRiMzRiZDg1NzYwNTIwYjdlMGNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4MjA1MDAwMDAwMDc1LC03OS4zNzg3OTMzOTg5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDBkZDI1MDE0ZWM1NGE3ZmEyYzNkZWUzMGFmY2U3NmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQzYjNjMjRkMmNiNGNlM2EzMjU2N2E0MTNhMDExMzcgPSAkKCc8ZGl2IGlkPSJodG1sXzBkM2IzYzI0ZDJjYjRjZTNhMzI1NjdhNDEzYTAxMTM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGRkMjUwMTRlYzU0YTdmYTJjM2RlZTMwYWZjZTc2Yy5zZXRDb250ZW50KGh0bWxfMGQzYjNjMjRkMmNiNGNlM2EzMjU2N2E0MTNhMDExMzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2U2OTZlNzY1ODQ3NGIzNGJkODU3NjA1MjBiN2UwY2IuYmluZFBvcHVwKHBvcHVwXzAwZGQyNTAxNGVjNTRhN2ZhMmMzZGVlMzBhZmNlNzZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhYjNlNzI1NWQzMDQ1OTJhOGU0ZTk2ZGJiOTc1YTA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM1NDYwMDAwMDAwMDQ2LC03OS40MTkxNjQxMjg5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YWQ3ZTQ5MjU2ZTA0MzIxODA2YTc3ZTliMTAxNzZhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOTM0NDcyZTI1N2M0N2U0YjI1MWYwMzI2OTFiZTE1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjkzNDQ3MmUyNTdjNDdlNGIyNTFmMDMyNjkxYmUxNTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhZDdlNDkyNTZlMDQzMjE4MDZhNzdlOWIxMDE3NmE4LnNldENvbnRlbnQoaHRtbF9mOTM0NDcyZTI1N2M0N2U0YjI1MWYwMzI2OTFiZTE1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYWIzZTcyNTVkMzA0NTkyYThlNGU5NmRiYjk3NWEwNC5iaW5kUG9wdXAocG9wdXBfNmFkN2U0OTI1NmUwNDMyMTgwNmE3N2U5YjEwMTc2YTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM3YTE2NmQxZjVmNDNkY2E1ZmVjMTc0MTVmMTJlYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTE5NDExNTQwMDAwNDQsLTc5LjQxOTExOTk5OTk5OTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkMWQ4YTQ4OWY3YzQ0MzY5ZTMzZGMyNDUxYmVkMjk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwYjRhZWIwYWEwZTQzZTBiMWZiYWFkNjcxOGYxYTQ0ID0gJCgnPGRpdiBpZD0iaHRtbF8yMGI0YWViMGFhMGU0M2UwYjFmYmFhZDY3MThmMWE0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDFkOGE0ODlmN2M0NDM2OWUzM2RjMjQ1MWJlZDI5OS5zZXRDb250ZW50KGh0bWxfMjBiNGFlYjBhYTBlNDNlMGIxZmJhYWQ2NzE4ZjFhNDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWM3YTE2NmQxZjVmNDNkY2E1ZmVjMTc0MTVmMTJlYzguYmluZFBvcHVwKHBvcHVwX2ZkMWQ4YTQ4OWY3YzQ0MzY5ZTMzZGMyNDUxYmVkMjk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxYzAxMjVhZTU2ZDRmODE5YTY3NTg5YmRjNjA2ZDMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk0Nzg1MDAwMDAwMDc0LC03OS40MTQ0MDQ4MzI5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGFjOTZlMGNhNDhlNGMxMDk0OTgxNTNmNmVkNGNlZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWJkMTVkZmY1ZDY0NGFkMGE5MzEzYTRhZWEyNTUwYTkgPSAkKCc8ZGl2IGlkPSJodG1sXzFiZDE1ZGZmNWQ2NDRhZDBhOTMxM2E0YWVhMjU1MGE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RhYzk2ZTBjYTQ4ZTRjMTA5NDk4MTUzZjZlZDRjZWY2LnNldENvbnRlbnQoaHRtbF8xYmQxNWRmZjVkNjQ0YWQwYTkzMTNhNGFlYTI1NTBhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MWMwMTI1YWU1NmQ0ZjgxOWE2NzU4OWJkYzYwNmQzMC5iaW5kUG9wdXAocG9wdXBfZGFjOTZlMGNhNDhlNGMxMDk0OTgxNTNmNmVkNGNlZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzY0YmE1MGU0YTE2NDAyOTk4NTdhOWM5YjRkMjBmY2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzQ4NDAwMDAwMDAwNzQsLTc5LjQwMzY5NzY5MDk5OTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iY2I1ZmE3MmNmZDY0ODM1OGMxNTg1YTFhZGEyY2U4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGRkZWU0MDgxZTc0MDhjYWU2NDlhYzFmYTZmOWU5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGRkZGVlNDA4MWU3NDA4Y2FlNjQ5YWMxZmE2ZjllOWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmNiNWZhNzJjZmQ2NDgzNThjMTU4NWExYWRhMmNlOGUuc2V0Q29udGVudChodG1sXzBkZGRlZTQwODFlNzQwOGNhZTY0OWFjMWZhNmY5ZTljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM2NGJhNTBlNGExNjQwMjk5ODU3YTljOWI0ZDIwZmNiLmJpbmRQb3B1cChwb3B1cF9iY2I1ZmE3MmNmZDY0ODM1OGMxNTg1YTFhZGEyY2U4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGMzZTY5NWNhZGM0OTgxODI2ZDgyNmM0MWYwNGExMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MzExMDAwMDAwMDA3NCwtNzkuNDAxODAwNTY2OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2ZjU3MzcyZWY2ZTQzNmNhZTEzMzBkODZhYjA4N2NkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1NjM0Mzg2NDdhOTQ0MDU5NGY3ZTY2MDlhZjBmZTJkID0gJCgnPGRpdiBpZD0iaHRtbF80NTYzNDM4NjQ3YTk0NDA1OTRmN2U2NjA5YWYwZmUyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDZmNTczNzJlZjZlNDM2Y2FlMTMzMGQ4NmFiMDg3Y2Quc2V0Q29udGVudChodG1sXzQ1NjM0Mzg2NDdhOTQ0MDU5NGY3ZTY2MDlhZjBmZTJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgwYzNlNjk1Y2FkYzQ5ODE4MjZkODI2YzQxZjA0YTEwLmJpbmRQb3B1cChwb3B1cF9kNmY1NzM3MmVmNmU0MzZjYWUxMzMwZDg2YWIwODdjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MjFkZjc2MDE1NDM0ZmE2YmNkZTA5M2JmOWM2MzE3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzU3MDAwMDAwMDA2NiwtNzkuMzk3MjQ5MTU2OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk3NjI2ZDdhNDA3YTQ4MjVhNjRjOTI1ZDhhNDNhMmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViNTdmYmQzMTFmOTQyNmM4OGM1MGEyMWZiOWExYTI3ID0gJCgnPGRpdiBpZD0iaHRtbF9lYjU3ZmJkMzExZjk0MjZjODhjNTBhMjFmYjlhMWEyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTc2MjZkN2E0MDdhNDgyNWE2NGM5MjVkOGE0M2EyZjYuc2V0Q29udGVudChodG1sX2ViNTdmYmQzMTFmOTQyNmM4OGM1MGEyMWZiOWExYTI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyMWRmNzYwMTU0MzRmYTZiY2RlMDkzYmY5YzYzMTc5LmJpbmRQb3B1cChwb3B1cF85NzYyNmQ3YTQwN2E0ODI1YTY0YzkyNWQ4YTQzYTJmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNTRmNGYwNmNiYTg0NjM3YTE4NTJjMThkMWZkMGZmZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MDgxNTAwMDAwMDAzLC03OS4zOTk1Mzc4MTg5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVmMjczMzQ1M2Y3NDE3ODk2ZTg3YzU3ZDdkYzMwZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRhMTdjZDM3YjQxNDc0MWFkMWZkMTEzNjBlZmU2NWMgPSAkKCc8ZGl2IGlkPSJodG1sXzlkYTE3Y2QzN2I0MTQ3NDFhZDFmZDExMzYwZWZlNjVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NWYyNzMzNDUzZjc0MTc4OTZlODdjNTdkN2RjMzBmNS5zZXRDb250ZW50KGh0bWxfOWRhMTdjZDM3YjQxNDc0MWFkMWZkMTEzNjBlZmU2NWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzU0ZjRmMDZjYmE4NDYzN2ExODUyYzE4ZDFmZDBmZmUuYmluZFBvcHVwKHBvcHVwXzg1ZjI3MzM0NTNmNzQxNzg5NmU4N2M1N2Q3ZGMzMGY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5OTBiNTRiYTk5YjQyZDI5NzYxNTliYTQyOTkwOThiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4NjkwMDAwMDAwMDQ1LC03OS4zODU0Mzk5OTk5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzNlMGM2Mzg1MjU3NGZiMDk1YTQwNmU1MDVjNzBjZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjQyNDliZGNmZWRhNGMzZWE0MTdlY2IyMDFmYzU3M2YgPSAkKCc8ZGl2IGlkPSJodG1sXzI0MjQ5YmRjZmVkYTRjM2VhNDE3ZWNiMjAxZmM1NzNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jM2UwYzYzODUyNTc0ZmIwOTVhNDA2ZTUwNWM3MGNkMS5zZXRDb250ZW50KGh0bWxfMjQyNDliZGNmZWRhNGMzZWE0MTdlY2IyMDFmYzU3M2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDk5MGI1NGJhOTliNDJkMjk3NjE1OWJhNDI5OTA5OGIuYmluZFBvcHVwKHBvcHVwX2MzZTBjNjM4NTI1NzRmYjA5NWE0MDZlNTA1YzcwY2QxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0YmNhZmNkYWUwMTRlYjVhMTdkNDg1NDMzNjQ0MDY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4MjgwMDAwMDAwMDY0LC03OS4zODE0NjA4MjU5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGE4OTg3NmNkNTkyNDE0YmEwMTZjMDEyMGM1YWViMWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTU0ZWI1NDcxOTI2NDVjN2E4NzUzMDE4OWRkOGE3ODAgPSAkKCc8ZGl2IGlkPSJodG1sX2U1NGViNTQ3MTkyNjQ1YzdhODc1MzAxODlkZDhhNzgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YTg5ODc2Y2Q1OTI0MTRiYTAxNmMwMTIwYzVhZWIxZS5zZXRDb250ZW50KGh0bWxfZTU0ZWI1NDcxOTI2NDVjN2E4NzUzMDE4OWRkOGE3ODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTRiY2FmY2RhZTAxNGViNWExN2Q0ODU0MzM2NDQwNjQuYmluZFBvcHVwKHBvcHVwXzRhODk4NzZjZDU5MjQxNGJhMDE2YzAxMjBjNWFlYjFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiYmJiNTc3MDgzMzQxY2ZiNDMwOTZhNGIzMmU1OTU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzIzMTI1MDAwMDAwMDQsLTc5LjQ1MTU4OTE0Njk5OTk0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0NmQwOGZjZTcxZTRjM2FhMjE1ZTZkNWE4NTY0MTUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1NmNiNjBiZDYxZTQ2ZjE4MTk1Yjg2MDA1MDU0ODkyID0gJCgnPGRpdiBpZD0iaHRtbF9kNTZjYjYwYmQ2MWU0NmYxODE5NWI4NjAwNTA1NDg5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQ2ZDA4ZmNlNzFlNGMzYWEyMTVlNmQ1YTg1NjQxNTMuc2V0Q29udGVudChodG1sX2Q1NmNiNjBiZDYxZTQ2ZjE4MTk1Yjg2MDA1MDU0ODkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiYmJiNTc3MDgzMzQxY2ZiNDMwOTZhNGIzMmU1OTU5LmJpbmRQb3B1cChwb3B1cF9lNDZkMDhmY2U3MWU0YzNhYTIxNWU2ZDVhODU2NDE1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDk3MTY3ZTI1NGM0NmZhODdlYWMyM2U1ZDZjMjg5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNzk5MDAwMDAwMDA0NSwtNzkuNDQ4MzY3MzMxOTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzMxMTUyMTg2ZDQ5NDRkYWFjZDU1ODNjZmJhNWFiNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmIxZDAwZWNkMDlhNGUyYzg2ZjM0MzU0NTc5MTA5NzcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiMWQwMGVjZDA5YTRlMmM4NmYzNDM1NDU3OTEwOTc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzExNTIxODZkNDk0NGRhYWNkNTU4M2NmYmE1YWI2YS5zZXRDb250ZW50KGh0bWxfZmIxZDAwZWNkMDlhNGUyYzg2ZjM0MzU0NTc5MTA5NzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjA5NzE2N2UyNTRjNDZmYTg3ZWFjMjNlNWQ2YzI4OTIuYmluZFBvcHVwKHBvcHVwXzMzMTE1MjE4NmQ0OTQ0ZGFhY2Q1NTgzY2ZiYTVhYjZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0ZTc0Y2UzZTA5OTRmMDlhZGUwZDMxYjMwNDhlZDkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkyMTA1MTc5MDAwMDcsLTc5LjQzMDM1NDk5OTk5OTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0Y2ZkZGMxN2RmNjRjOTRhNmVmZTRhN2IyMzk1Y2I4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NkOGExYjc3MmIzOTRlMDY4NTdhNzEyMTJiODIxNzZhID0gJCgnPGRpdiBpZD0iaHRtbF9jZDhhMWI3NzJiMzk0ZTA2ODU3YTcxMjEyYjgyMTc2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRjZmRkYzE3ZGY2NGM5NGE2ZWZlNGE3YjIzOTVjYjguc2V0Q29udGVudChodG1sX2NkOGExYjc3MmIzOTRlMDY4NTdhNzEyMTJiODIxNzZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M0ZTc0Y2UzZTA5OTRmMDlhZGUwZDMxYjMwNDhlZDkzLmJpbmRQb3B1cChwb3B1cF82NGNmZGRjMTdkZjY0Yzk0YTZlZmU0YTdiMjM5NWNiOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80M2FhYmMwZGMzNzI0ZWUyOWZjYmRiZDU3MmM5ZTE0ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4ODY0MDAwMDAwMDA4LC03OS40NTEwMTUyNTI5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMjQ2N2ZjZWVjMDk0OTdlOTI5NTg1ODIzMGRlYjM3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTgyM2M3YjcwYzE0MjYxYjBmZWU4ZGRiMDA4MzE3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDE4MjNjN2I3MGMxNDI2MWIwZmVlOGRkYjAwODMxN2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyNDY3ZmNlZWMwOTQ5N2U5Mjk1ODU4MjMwZGViMzdlLnNldENvbnRlbnQoaHRtbF80MTgyM2M3YjcwYzE0MjYxYjBmZWU4ZGRiMDA4MzE3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80M2FhYmMwZGMzNzI0ZWUyOWZjYmRiZDU3MmM5ZTE0ZS5iaW5kUG9wdXAocG9wdXBfYzI0NjdmY2VlYzA5NDk3ZTkyOTU4NTgyMzBkZWIzN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjE3ODM0NDBkY2EwNDhmN2FiM2Q0NjlkYzMzODcyZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njg3ODEzMjgwMDAwOCwtNzkuNDIwNzA5OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1YTE2ODJlYTg0NzQxYWFhNWVlYjk0ODVmMmU3ZGM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkZGExNjVmYzQ4MjQ0ZmI4OWJkZWYyM2I3ZjYwZTdmID0gJCgnPGRpdiBpZD0iaHRtbF9hZGRhMTY1ZmM0ODI0NGZiODliZGVmMjNiN2Y2MGU3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTVhMTY4MmVhODQ3NDFhYWE1ZWViOTQ4NWYyZTdkYzQuc2V0Q29udGVudChodG1sX2FkZGExNjVmYzQ4MjQ0ZmI4OWJkZWYyM2I3ZjYwZTdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxNzgzNDQwZGNhMDQ4ZjdhYjNkNDY5ZGMzMzg3MmRmLmJpbmRQb3B1cChwb3B1cF81NWExNjgyZWE4NDc0MWFhYTVlZWI5NDg1ZjJlN2RjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMjUwMTVmNmQ5MWU0OThjYTMxMWJlOGQyNjg4OTU4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2NTA4Njk0MzAwMDA2LC03OS40Mzg3MDQ5OTk5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODU2ZGFiNTJhYmQ1NDY0ZGI2NmNmNjcyNDM1Y2QzNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWFhMmIzYTU3M2Y3NDU2MmI0ZDNjZGNiZjZiZjk0NDEgPSAkKCc8ZGl2IGlkPSJodG1sXzVhYTJiM2E1NzNmNzQ1NjJiNGQzY2RjYmY2YmY5NDQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1NmRhYjUyYWJkNTQ2NGRiNjZjZjY3MjQzNWNkMzZhLnNldENvbnRlbnQoaHRtbF81YWEyYjNhNTczZjc0NTYyYjRkM2NkY2JmNmJmOTQ0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMjUwMTVmNmQ5MWU0OThjYTMxMWJlOGQyNjg4OTU4My5iaW5kUG9wdXAocG9wdXBfODU2ZGFiNTJhYmQ1NDY0ZGI2NmNmNjcyNDM1Y2QzNmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM2Y2I5M2M0YTczNGRiYjg0M2MxMjM5OTcxZDhmMDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg0ODUwMDAwMDAwNSwtNzkuNDE3NzQxNTA4OTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2Nzc2NGExNDIxMjQ5MmM4MmQwMWNlNmI3YTkyZDA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkNDU4Nzc1ZWFlYjQ0MzBiMGYzNjYwYTFmYjdlMzc0ID0gJCgnPGRpdiBpZD0iaHRtbF8xZDQ1ODc3NWVhZWI0NDMwYjBmMzY2MGExZmI3ZTM3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjc3NjRhMTQyMTI0OTJjODJkMDFjZTZiN2E5MmQwNS5zZXRDb250ZW50KGh0bWxfMWQ0NTg3NzVlYWViNDQzMGIwZjM2NjBhMWZiN2UzNzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzM2Y2I5M2M0YTczNGRiYjg0M2MxMjM5OTcxZDhmMDcuYmluZFBvcHVwKHBvcHVwX2U2Nzc2NGExNDIxMjQ5MmM4MmQwMWNlNmI3YTkyZDA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4OWU1ZDY2OWIwZjQ0Mzc5YmI1NzZiZTBlNDZkOTUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM5NDEwMDAwMDAwMDU1LC03OS40MjQzNjIwMTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzI5ZTc5M2MxNzc4NDlmZDkyMWQ3YjhiZTYyYjNkZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E0OTFjODIyODk1NGVhMjk4NzMxNDkzYjkyMjkwNzQgPSAkKCc8ZGl2IGlkPSJodG1sXzNhNDkxYzgyMjg5NTRlYTI5ODczMTQ5M2I5MjI5MDc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyOWU3OTNjMTc3ODQ5ZmQ5MjFkN2I4YmU2MmIzZGQzLnNldENvbnRlbnQoaHRtbF8zYTQ5MWM4MjI4OTU0ZWEyOTg3MzE0OTNiOTIyOTA3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kODllNWQ2NjliMGY0NDM3OWJiNTc2YmUwZTQ2ZDk1Mi5iaW5kUG9wdXAocG9wdXBfYzI5ZTc5M2MxNzc4NDlmZDkyMWQ3YjhiZTYyYjNkZDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTgyYzY4NjZkMjdlNGU1NjhhMmQ2NjMwOTcyOGU3OGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTM4MTAwMDAwMDAwNywtNzkuNDg4MzA1NDExOTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDQ0NDFlOGI0MDMxNDA1YWI4MTJmMmZjYmQ3MzM5NGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTAwMDkxMjkwMmNiNGEyZWI3NDc1NzhiNGQxNjM2MDMgPSAkKCc8ZGl2IGlkPSJodG1sXzUwMDA5MTI5MDJjYjRhMmViNzQ3NTc4YjRkMTYzNjAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NDQ0MWU4YjQwMzE0MDVhYjgxMmYyZmNiZDczMzk0Yi5zZXRDb250ZW50KGh0bWxfNTAwMDkxMjkwMmNiNGEyZWI3NDc1NzhiNGQxNjM2MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTgyYzY4NjZkMjdlNGU1NjhhMmQ2NjMwOTcyOGU3OGMuYmluZFBvcHVwKHBvcHVwXzQ0NDQxZThiNDAzMTQwNWFiODEyZjJmY2JkNzMzOTRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0ZDI1NTgwNDY4OTRmYzRhMzdkODFkMjExZmJjODQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk0NTQ1MDAwMDAwMDcsLTc5LjQ4NDY0Mjc4MDk5OTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlZDkwYTFjMmExMDRmZDM4MzU2MWJjOTFiNjJhN2FmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5NTlhNjhkMjg4YTRmNDU5MmY1NWM4OGFhMmZmNGZmID0gJCgnPGRpdiBpZD0iaHRtbF82OTU5YTY4ZDI4OGE0ZjQ1OTJmNTVjODhhYTJmZjRmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGVkOTBhMWMyYTEwNGZkMzgzNTYxYmM5MWI2MmE3YWYuc2V0Q29udGVudChodG1sXzY5NTlhNjhkMjg4YTRmNDU5MmY1NWM4OGFhMmZmNGZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0ZDI1NTgwNDY4OTRmYzRhMzdkODFkMjExZmJjODQ2LmJpbmRQb3B1cChwb3B1cF8wZWQ5MGExYzJhMTA0ZmQzODM1NjFiYzkxYjYyYTdhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NTIyZWVhMGYyNDE0YzZhOTc5YTdiMDhjYTFiMDY2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3NTgyNTAwMDAwMDAzLC03OS40ODIwNTIyMzE5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDk2ODZkZDkwYWE0OWJhYTE3ZjJjMjdiMjA2YmY0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MmE5ZTkyZTEwOWY0NmI1OGViN2E0YjE4NTAwOGYzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDJhOWU5MmUxMDlmNDZiNThlYjdhNGIxODUwMDhmM2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0OTY4NmRkOTBhYTQ5YmFhMTdmMmMyN2IyMDZiZjQ1LnNldENvbnRlbnQoaHRtbF80MmE5ZTkyZTEwOWY0NmI1OGViN2E0YjE4NTAwOGYzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NTIyZWVhMGYyNDE0YzZhOTc5YTdiMDhjYTFiMDY2MS5iaW5kUG9wdXAocG9wdXBfZjQ5Njg2ZGQ5MGFhNDliYWExN2YyYzI3YjIwNmJmNDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzNkODFkYzNhYzVkNGQ2ODkxNjAwOGZkNTQ2MWNmNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTk5NzUwMDAwMDAwMywtNzkuNDYyODczNTc5OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDkzOTQyOGRjYzdkNDA3MDg2Y2JhYmVlNTU0OTU2N2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjczMjI5MWU2ZWVlNDQwYjhkYTRhYmI4YzM1NjA5NjcgPSAkKCc8ZGl2IGlkPSJodG1sXzY3MzIyOTFlNmVlZTQ0MGI4ZGE0YWJiOGMzNTYwOTY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5Mzk0MjhkY2M3ZDQwNzA4NmNiYWJlZTU1NDk1NjdmLnNldENvbnRlbnQoaHRtbF82NzMyMjkxZTZlZWU0NDBiOGRhNGFiYjhjMzU2MDk2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83M2Q4MWRjM2FjNWQ0ZDY4OTE2MDA4ZmQ1NDYxY2Y0MS5iaW5kUG9wdXAocG9wdXBfMDkzOTQyOGRjYzdkNDA3MDg2Y2JhYmVlNTU0OTU2N2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWM5NmM0MTljNWI3NGFlYWIyYTk3YTA0MDZkN2YwZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDc4NzAwMDAwMDAwNywtNzkuNDQ5NzYyNDk5OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxOTJkYmU1OTg3ZDRiOGM4ZDNiMjc0MmRlMzQ5NTgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4OTFmZWY4YmU1OTQ4Zjk5ZDkyMjM0NmJhZTViMWRlID0gJCgnPGRpdiBpZD0iaHRtbF9mODkxZmVmOGJlNTk0OGY5OWQ5MjIzNDZiYWU1YjFkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTkyZGJlNTk4N2Q0YjhjOGQzYjI3NDJkZTM0OTU4MC5zZXRDb250ZW50KGh0bWxfZjg5MWZlZjhiZTU5NDhmOTlkOTIyMzQ2YmFlNWIxZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWM5NmM0MTljNWI3NGFlYWIyYTk3YTA0MDZkN2YwZmMuYmluZFBvcHVwKHBvcHVwXzUxOTJkYmU1OTg3ZDRiOGM4ZDNiMjc0MmRlMzQ5NTgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1NGZhZWY2Njk2MDRlZTc5YjU4NmExNGRjMDZlY2Q5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ5ODg1MDAwMDAwMDQsLTc5LjQ3NDkyODc5NTk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlM2QxYWVkZTU0ODRiYjk4NjhlM2RhNGI3ZWZiNWViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1OWZhYWM0ZTFjNjRjNGQ4OWViNmM0MjQ2ZTIyZDgwID0gJCgnPGRpdiBpZD0iaHRtbF81NTlmYWFjNGUxYzY0YzRkODllYjZjNDI0NmUyMmQ4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTNkMWFlZGU1NDg0YmI5ODY4ZTNkYTRiN2VmYjVlYi5zZXRDb250ZW50KGh0bWxfNTU5ZmFhYzRlMWM2NGM0ZDg5ZWI2YzQyNDZlMjJkODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDU0ZmFlZjY2OTYwNGVlNzliNTg2YTE0ZGMwNmVjZDkuYmluZFBvcHVwKHBvcHVwXzFlM2QxYWVkZTU0ODRiYjk4NjhlM2RhNGI3ZWZiNWViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlNGIwNmQ4MjBkYjQyNjJiM2VmMzNjNTE3NDM4YzcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYxMTAyMjk4MDAwMDYsLTc5LjM5MTAzNDk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMDBiMjk2ZmY2Yzg0MmRkYTYzMGJlNjNlMTJkZWE1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80M2E4NmZlNDY1MmE0M2VhODAyNzM1MzllYjVkMTYwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDNhODZmZTQ2NTJhNDNlYTgwMjczNTM5ZWI1ZDE2MGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlF1ZWVuJiMzOTtzIFBhcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YwMGIyOTZmZjZjODQyZGRhNjMwYmU2M2UxMmRlYTU2LnNldENvbnRlbnQoaHRtbF80M2E4NmZlNDY1MmE0M2VhODAyNzM1MzllYjVkMTYwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZTRiMDZkODIwZGI0MjYyYjNlZjMzYzUxNzQzOGM3MS5iaW5kUG9wdXAocG9wdXBfZjAwYjI5NmZmNmM4NDJkZGE2MzBiZTYzZTEyZGVhNTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYThmZmQwZTBjMTc3NDRkMDg5MmRiNDI3N2M3ZjA0ZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg2OTAwMDAwMDAwNDUsLTc5LjM4NTQzOTk5OTk5OTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNTFiMThmZWRkYjQ0YzViYmZlY2RkNTc1YWJkYTNkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTg2ZTYwMDRhZTU0ODlkYmYxZDJlOTgwMjI5N2UwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmU4NmU2MDA0YWU1NDg5ZGJmMWQyZTk4MDIyOTdlMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pc3Npc3NhdWdhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNTFiMThmZWRkYjQ0YzViYmZlY2RkNTc1YWJkYTNkMy5zZXRDb250ZW50KGh0bWxfMmU4NmU2MDA0YWU1NDg5ZGJmMWQyZTk4MDIyOTdlMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYThmZmQwZTBjMTc3NDRkMDg5MmRiNDI3N2M3ZjA0ZmYuYmluZFBvcHVwKHBvcHVwXzA1MWIxOGZlZGRiNDRjNWJiZmVjZGQ1NzVhYmRhM2QzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3MzNkODkxYTM2ZTQ2NWI4NmYzNDVjYTkxMDNkMTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4NjkwMDAwMDAwMDQ1LC03OS4zODU0Mzk5OTk5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmJmOWE3YjAxNDM4NDkyOGIyZWQ4MGQ4YTAyNzMwM2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzAxNmM3ODRiMjcyNGEzMmExMDk1OGQ3Yjg3MTkzZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzMwMTZjNzg0YjI3MjRhMzJhMTA5NThkN2I4NzE5M2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiZjlhN2IwMTQzODQ5MjhiMmVkODBkOGEwMjczMDNiLnNldENvbnRlbnQoaHRtbF8zMDE2Yzc4NGIyNzI0YTMyYTEwOTU4ZDdiODcxOTNmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNzMzZDg5MWEzNmU0NjViODZmMzQ1Y2E5MTAzZDE1MC5iaW5kUG9wdXAocG9wdXBfYmJmOWE3YjAxNDM4NDkyOGIyZWQ4MGQ4YTAyNzMwM2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTlhMmY0ZjNkNjJkNGJkYmE1MjE2N2MwMzM4ZTFiMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MDk4NzAwMDAwMDAwNjUsLTc5LjQ5ODE3ODIzODk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1YTA2NGIzYTkzOTQ2MWNhMTE5MzI3Y2ZkMjVjMDYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1YjkxYjAwNTc0NDQ1ZWQ4Mjg4ZGU5ZTAxOWVjNDAzID0gJCgnPGRpdiBpZD0iaHRtbF85NWI5MWIwMDU3NDQ0NWVkODI4OGRlOWUwMTllYzQwMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNWEwNjRiM2E5Mzk0NjFjYTExOTMyN2NmZDI1YzA2Mi5zZXRDb250ZW50KGh0bWxfOTViOTFiMDA1NzQ0NDVlZDgyODhkZTllMDE5ZWM0MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTlhMmY0ZjNkNjJkNGJkYmE1MjE2N2MwMzM4ZTFiMGYuYmluZFBvcHVwKHBvcHVwXzM1YTA2NGIzYTkzOTQ2MWNhMTE5MzI3Y2ZkMjVjMDYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxMmMyM2Q4MzE0OTQ3YzZiOTMxZGJiYzQ5MjQ5ZjFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAxMTMwODIxMDAwMDM0LC03OS41Mzg3ODQ5OTk5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOWJlNTliYTM0MDc0YzhjYmUyNGYwODY0ODdjM2QwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNjNmZmM4ODI4MTU0ZjJjYjc5MTZjMTVjMGYwMTMzNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTYzZmZjODgyODE1NGYyY2I3OTE2YzE1YzBmMDEzMzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDliZTU5YmEzNDA3NGM4Y2JlMjRmMDg2NDg3YzNkMDMuc2V0Q29udGVudChodG1sX2E2M2ZmYzg4MjgxNTRmMmNiNzkxNmMxNWMwZjAxMzM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQxMmMyM2Q4MzE0OTQ3YzZiOTMxZGJiYzQ5MjQ5ZjFiLmJpbmRQb3B1cChwb3B1cF8wOWJlNTliYTM0MDc0YzhjYmUyNGYwODY0ODdjM2QwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZTA4MGM3YmRiMTg0MDI2ODA4NjU4ODM2NjA3ZGJlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzY5MDAwMDAwMDA0LC03OS41MTExMTcxNzI5OTk5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMmFkZWNiZDljM2U0MTYwYTI2MTliZTUyMmU2OWIzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZDM2Nzg4MmFiM2E0YTc4YWZhYTNmNDU4NGVlYzk4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMWQzNjc4ODJhYjNhNGE3OGFmYWEzZjQ1ODRlZWM5ODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjJhZGVjYmQ5YzNlNDE2MGEyNjE5YmU1MjJlNjliMzIuc2V0Q29udGVudChodG1sXzFkMzY3ODgyYWIzYTRhNzhhZmFhM2Y0NTg0ZWVjOTgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdlMDgwYzdiZGIxODQwMjY4MDg2NTg4MzY2MDdkYmU4LmJpbmRQb3B1cChwb3B1cF9iMmFkZWNiZDljM2U0MTYwYTI2MTliZTUyMmU2OWIzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTA4MzhmNzM5Mzc0MzhhYWIyNjBhZDFhM2UzN2MwMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzMjc2NTAwMDAwMDA3LC03OS40ODk2MDE0MTE5OTk5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kY2Y1NWMzNjJmM2E0NDdmYmY0NDgyMWNlYTE5YWYzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTZmNzE4NzMxMzI0ZDRhYTI0YmQxNzkzOTc3ZDE1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjE2ZjcxODczMTMyNGQ0YWEyNGJkMTc5Mzk3N2QxNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGNmNTVjMzYyZjNhNDQ3ZmJmNDQ4MjFjZWExOWFmMzIuc2V0Q29udGVudChodG1sX2YxNmY3MTg3MzEzMjRkNGFhMjRiZDE3OTM5NzdkMTViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5MDgzOGY3MzkzNzQzOGFhYjI2MGFkMWEzZTM3YzAyLmJpbmRQb3B1cChwb3B1cF9kY2Y1NWMzNjJmM2E0NDdmYmY0NDgyMWNlYTE5YWYzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmZiN2JmMDg4YzQ0NDEwYTQ0MTE4ZDAyZGU0MWE0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyNDYzMDAwMDAwMDAyLC03OS41MjY5NDk3NjE5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2QyYmJjYmUzZGQ0MTkxYTM0ZDg5MTkzZDM2YmY1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZWJkZmYxYzA4NDg0NTU3YTdkZDExM2E5ZjJjY2JiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmViZGZmMWMwODQ4NDU1N2E3ZGQxMTNhOWYyY2NiYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzNkMmJiY2JlM2RkNDE5MWEzNGQ4OTE5M2QzNmJmNTcuc2V0Q29udGVudChodG1sX2ZlYmRmZjFjMDg0ODQ1NTdhN2RkMTEzYTlmMmNjYmIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiZmI3YmYwODhjNDQ0MTBhNDQxMThkMDJkZTQxYTRmLmJpbmRQb3B1cChwb3B1cF83M2QyYmJjYmUzZGQ0MTkxYTM0ZDg5MTkzZDM2YmY1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ODc4MTNlZDQ3ZGY0Y2U3OTMxYjczYmVlYzhjNGEzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjI0MjIwMTAwMDAyNiwtNzkuNTI4Mzc4NzcxOTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzY0ZWY5MmIzYzBkNDI4ZmJjNTdjYjdmYjcyZjNhMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGEwOWQ5OGIwOGUwNGE5YjlkNGI3Zjc5OWM3ZWI3NWQgPSAkKCc8ZGl2IGlkPSJodG1sXzhhMDlkOThiMDhlMDRhOWI5ZDRiN2Y3OTljN2ViNzVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2NGVmOTJiM2MwZDQyOGZiYzU3Y2I3ZmI3MmYzYTIwLnNldENvbnRlbnQoaHRtbF84YTA5ZDk4YjA4ZTA0YTliOWQ0YjdmNzk5YzdlYjc1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ODc4MTNlZDQ3ZGY0Y2U3OTMxYjczYmVlYzhjNGEzNC5iaW5kUG9wdXAocG9wdXBfMzY0ZWY5MmIzYzBkNDI4ZmJjNTdjYjdmYjcyZjNhMjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGM0M2VlNGYxNWJmNDFlNDk4NGZjM2Q5ZWNjOGQzZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDk2OTIyMjcwMDAwNywtNzkuNTUzOTQ0OTk5OTk5OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzFmN2QyYzBiODFkNGUxMGJiNjcyY2EyYzI2Yjc2NzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2QzZDQ3Mzc3MThkNDhmMmJiNjRmNGQ4OTQ0MjM3ZDQgPSAkKCc8ZGl2IGlkPSJodG1sX2NkM2Q0NzM3NzE4ZDQ4ZjJiYjY0ZjRkODk0NDIzN2Q0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxZjdkMmMwYjgxZDRlMTBiYjY3MmNhMmMyNmI3Njc0LnNldENvbnRlbnQoaHRtbF9jZDNkNDczNzcxOGQ0OGYyYmI2NGY0ZDg5NDQyMzdkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYzQzZWU0ZjE1YmY0MWU0OTg0ZmMzZDllY2M4ZDNlMS5iaW5kUG9wdXAocG9wdXBfNzFmN2QyYzBiODFkNGUxMGJiNjcyY2EyYzI2Yjc2NzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzRlYmQ1OWU5MTVjNDQ4ZjhjOWZlMmRhOTYyMTljZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg1NzM0NDkwMDAwMjUsLTc5LjU3ODI0OTk5OTk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyZGE1ODRmMjg2MzRhOTg5OGE1NThiNTY5NDgzNWEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4NzE4ZjZjMGFkOTRhZWM4MmQ0NDcxZGExYTc3Nzg4ID0gJCgnPGRpdiBpZD0iaHRtbF8zODcxOGY2YzBhZDk0YWVjODJkNDQ3MWRhMWE3Nzc4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMmRhNTg0ZjI4NjM0YTk4OThhNTU4YjU2OTQ4MzVhMC5zZXRDb250ZW50KGh0bWxfMzg3MThmNmMwYWQ5NGFlYzgyZDQ0NzFkYTFhNzc3ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzRlYmQ1OWU5MTVjNDQ4ZjhjOWZlMmRhOTYyMTljZGMuYmluZFBvcHVwKHBvcHVwXzIyZGE1ODRmMjg2MzRhOTg5OGE1NThiNTY5NDgzNWEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiMmMxNmZlYjBlOTRjMDZiMGFlZjFlZDg5NzZjZjVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU5NTAwMDAwMDAwMDcsLTc5LjU1Njg1MjM1Mjk5OTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkNDk2NzA4NzRkYjQ2N2VhMWFlYzAzZTdhMjYyZmZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyNGJlYTdiN2I1OTRjZjBhMTZiMmE5OGViMmExNTViID0gJCgnPGRpdiBpZD0iaHRtbF8xMjRiZWE3YjdiNTk0Y2YwYTE2YjJhOThlYjJhMTU1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGQ0OTY3MDg3NGRiNDY3ZWExYWVjMDNlN2EyNjJmZmUuc2V0Q29udGVudChodG1sXzEyNGJlYTdiN2I1OTRjZjBhMTZiMmE5OGViMmExNTViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiMmMxNmZlYjBlOTRjMDZiMGFlZjFlZDg5NzZjZjVkLmJpbmRQb3B1cChwb3B1cF9kZDQ5NjcwODc0ZGI0NjdlYTFhZWMwM2U3YTI2MmZmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZjc0MDFiYzYwZjU0YjJkOGI2ODkwMzk2ZDU0OWIxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczMzc2MDAwMDAwMDA3NSwtNzkuNTM3NTIxODk0OTk5OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDYyMTRiNGJlZTYyNGM5ZmE2MTU2ZjYzZmRmMmI4MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTE4ODA4YTMzYmZiNDAxZWEzOGIwZTdmMWRmNzc4NGEgPSAkKCc8ZGl2IGlkPSJodG1sXzExODgwOGEzM2JmYjQwMWVhMzhiMGU3ZjFkZjc3ODRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNjIxNGI0YmVlNjI0YzlmYTYxNTZmNjNmZGYyYjgxNS5zZXRDb250ZW50KGh0bWxfMTE4ODA4YTMzYmZiNDAxZWEzOGIwZTdmMWRmNzc4NGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2Y3NDAxYmM2MGY1NGIyZDhiNjg5MDM5NmQ1NDliMTkuYmluZFBvcHVwKHBvcHVwX2Q2MjE0YjRiZWU2MjRjOWZhNjE1NmY2M2ZkZjJiODE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViNzUxZDRhMGFiMDRkYzE5YTg5YjAwMDBlYWU5ZDgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA0ODU1MDAwMDAwMDY2LC03OS41MTc1NTI0MjE5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNzljNGNkNjE2NjA0NTEwODk5MjY0NmRlNGYxYzkyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzQzOTE4ZGNmY2Q0YjU3YTliNjhlMzA4OWQ0ODczMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGM0MzkxOGRjZmNkNGI1N2E5YjY4ZTMwODlkNDg3MzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3OWM0Y2Q2MTY2MDQ1MTA4OTkyNjQ2ZGU0ZjFjOTIxLnNldENvbnRlbnQoaHRtbF9kYzQzOTE4ZGNmY2Q0YjU3YTliNjhlMzA4OWQ0ODczMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81Yjc1MWQ0YTBhYjA0ZGMxOWE4OWIwMDAwZWFlOWQ4My5iaW5kUG9wdXAocG9wdXBfZTc5YzRjZDYxNjYwNDUxMDg5OTI2NDZkZTRmMWM5MjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjg2ZTczNWM2ZGJhNDVjOTlkZGI4ZTNmN2QzMDk2MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTYzMDAwMDAwMDAwNjUsLTc5LjUzMDM5ODYyNzk5OTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzQ5MzNkYjU4MzJlOTQxMTA4MTZiM2I4NTQyOWQ2MjFlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y5OGNjNmNjMjBlNjRmNWNiMzBmZjNlNDY5N2E4OWFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3MmNjYjZiMjA4ZDQ3YTg4NDk5Yzg4YjhhZGJjNThmID0gJCgnPGRpdiBpZD0iaHRtbF9kNzJjY2I2YjIwOGQ0N2E4ODQ5OWM4OGI4YWRiYzU4ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOThjYzZjYzIwZTY0ZjVjYjMwZmYzZTQ2OTdhODlhYS5zZXRDb250ZW50KGh0bWxfZDcyY2NiNmIyMDhkNDdhODg0OTljODhiOGFkYmM1OGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjg2ZTczNWM2ZGJhNDVjOTlkZGI4ZTNmN2QzMDk2MzQuYmluZFBvcHVwKHBvcHVwX2Y5OGNjNmNjMjBlNjRmNWNiMzBmZjNlNDY5N2E4OWFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyYjU0NzZhMGZlZDRhMTNhM2JiMjkyNjcyNzQ4ZGIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg2OTE1MDAwMDAwMDU2LC03OS41NTcyNzYwOTU5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80OTMzZGI1ODMyZTk0MTEwODE2YjNiODU0MjlkNjIxZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MTgyOTA3ZTc0N2U0NmI2YTYwMTIzYmRjMWI5M2Q5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYzcwNjcwZjQ2ZGY0Njg2OGI3NjJkZjhkNzk3NjVlMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmM3MDY3MGY0NmRmNDY4NjhiNzYyZGY4ZDc5NzY1ZTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODE4MjkwN2U3NDdlNDZiNmE2MDEyM2JkYzFiOTNkOTQuc2V0Q29udGVudChodG1sX2ZjNzA2NzBmNDZkZjQ2ODY4Yjc2MmRmOGQ3OTc2NWUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyYjU0NzZhMGZlZDRhMTNhM2JiMjkyNjcyNzQ4ZGIwLmJpbmRQb3B1cChwb3B1cF84MTgyOTA3ZTc0N2U0NmI2YTYwMTIzYmRjMWI5M2Q5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjAyOGM0ODIxNzI0ZDIzOTdkMjA0NzRlM2YxNDhmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0MzIwNTAwMDAwMDA0NiwtNzkuNTg0NzAxMzE1OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzg1OTAwZWZhMDdmNGE5N2FhYzVlZDZjMzliNDBmNzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc4NTk5MjZjMzRlNDU3ZWIwZGExNzExMWU2Yjg5NzQgPSAkKCc8ZGl2IGlkPSJodG1sXzE3ODU5OTI2YzM0ZTQ1N2ViMGRhMTcxMTFlNmI4OTc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc4NTkwMGVmYTA3ZjRhOTdhYWM1ZWQ2YzM5YjQwZjc4LnNldENvbnRlbnQoaHRtbF8xNzg1OTkyNmMzNGU0NTdlYjBkYTE3MTExZTZiODk3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjAyOGM0ODIxNzI0ZDIzOTdkMjA0NzRlM2YxNDhmYi5iaW5kUG9wdXAocG9wdXBfNzg1OTAwZWZhMDdmNGE5N2FhYzVlZDZjMzliNDBmNzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzUwYTlkNGY1MzJjNDBjNjgzZjM1MGFlZjZkZjRhMTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTE3NDAwMDAwMDAwOCwtNzkuNTc5MTgxMzQ1OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDkzM2RiNTgzMmU5NDExMDgxNmIzYjg1NDI5ZDYyMWUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJkZmQzMzgxYjBiNDUwOWIxMDhkYjUyY2E1NzJkMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIwNTg4YThjMDhmNDY5ZDg3NDNjMmU2NTc0OWM5MmMgPSAkKCc8ZGl2IGlkPSJodG1sXzUyMDU4OGE4YzA4ZjQ2OWQ4NzQzYzJlNjU3NDljOTJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiZGZkMzM4MWIwYjQ1MDliMTA4ZGI1MmNhNTcyZDAyLnNldENvbnRlbnQoaHRtbF81MjA1ODhhOGMwOGY0NjlkODc0M2MyZTY1NzQ5YzkyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTBhOWQ0ZjUzMmM0MGM2ODNmMzUwYWVmNmRmNGExOS5iaW5kUG9wdXAocG9wdXBfNGJkZmQzMzgxYjBiNDUwOWIxMDhkYjUyY2E1NzJkMDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
  178.       ],
  179.       "text/plain": [
  180.        "<folium.folium.Map at 0x7f90d5655ef0>"
  181.       ]
  182.      },
  183.      "execution_count": 5,
  184.      "metadata": {},
  185.      "output_type": "execute_result"
  186.     }
  187.    ],
  188.    "source": [
  189.     "toronto_map = folium.Map(location=[43.65, -79.4], zoom_start=12)\n",
  190.     "\n",
  191.     "X = TorontoData['Latitude']\n",
  192.     "Y = TorontoData['Longitude']\n",
  193.     "Z = np.stack((X, Y), axis=1)\n",
  194.     "\n",
  195.     "kmeans = KMeans(n_clusters=4, random_state=0).fit(Z)\n",
  196.     "\n",
  197.     "clusters = kmeans.labels_\n",
  198.     "colors = ['red', 'green', 'blue', 'yellow']\n",
  199.     "TorontoData['Cluster'] = clusters\n",
  200.     "\n",
  201.     "for latitude, longitude, borough, cluster in zip(TorontoData['Latitude'], TorontoData['Longitude'], TorontoData['Borough'], TorontoData['Cluster']):\n",
  202.     "    label = folium.Popup(borough, parse_html=True)\n",
  203.     "    folium.CircleMarker(\n",
  204.     "        [latitude, longitude],\n",
  205.     "        radius=5,\n",
  206.     "        popup=label,\n",
  207.     "        color='black',\n",
  208.     "        fill=True,\n",
  209.     "        fill_color=colors[cluster],\n",
  210.     "        fill_opacity=0.7).add_to(toronto_map)  \n",
  211.     "\n",
  212.     "toronto_map"
  213.    ]
  214.   },
  215.   {
  216.    "cell_type": "code",
  217.    "execution_count": null,
  218.    "metadata": {},
  219.    "outputs": [],
  220.    "source": []
  221.   }
  222.  ],
  223.  "metadata": {
  224.   "kernelspec": {
  225.    "display_name": "Python 3",
  226.    "language": "python",
  227.    "name": "python3"
  228.   },
  229.   "language_info": {
  230.    "codemirror_mode": {
  231.     "name": "ipython",
  232.     "version": 3
  233.    },
  234.    "file_extension": ".py",
  235.    "mimetype": "text/x-python",
  236.    "name": "python",
  237.    "nbconvert_exporter": "python",
  238.    "pygments_lexer": "ipython3",
  239.    "version": "3.6.7"
  240.   }
  241.  },
  242.  "nbformat": 4,
  243.  "nbformat_minor": 4
  244. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top