Skip to content

Instantly share code, notes, and snippets.

@du2x
Created January 28, 2020 01:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save du2x/337882e8ee1c7eb0f1355156f4816a05 to your computer and use it in GitHub Desktop.
Save du2x/337882e8ee1c7eb0f1355156f4816a05 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Neighbordhood Venues Categories Pattern vs Neighborhood Prevailing Social Classes"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Solving environment: done\n",
"\n",
"\n",
"==> WARNING: A newer version of conda exists. <==\n",
" current version: 4.5.11\n",
" latest version: 4.8.1\n",
"\n",
"Please update conda by running\n",
"\n",
" $ conda update -n base -c defaults conda\n",
"\n",
"\n",
"\n",
"# All requested packages already installed.\n",
"\n",
"Hello Capstone Project Course!\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"import requests\n",
"\n",
"CLIENT_ID = 'SPRWEPOSZVPI0WZ4MTQHQZWDYUSWBJ4FWK01XRNPQ25RGA4Z'\n",
"CLIENT_SECRET = 'APDO2EBXWWR2LNB5V0V13MX40ZEJBFXPDMHS04WLFHBPNHPJ'\n",
"\n",
"VERSION = '20180605' # Foursquare API version\n",
"\n",
"!conda install -c conda-forge folium=0.5.0 --yes # uncomment if needed\n",
"\n",
"print('Hello Capstone Project Course!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Introduction \n",
"\n",
"For an entrepreneur, choosing the location of a new establishment within a city can be a very important and also very difficult task. For this, it is advisable to have as much information as possible from each neighborhood.\n",
"\n",
"Similarly, the city government also needs as much information as possible from each neighborhood to manage them properly.\n",
"\n",
"Amongst all information about neighborhoods, one that stands out is its prevailing social class. The needs and opportunities of a neighborhood are often associated with this information.\n",
"\n",
"Here, we will seek to develop a model capable of predicting the prevailing social class of each neighborhood, based on the categories of establishments there. This model will be trained with data from the set of reports of establishments in each neighborhood, retrievable from the Foursquare API and with the data a report from UFMG (University of Minas Gerais) that informs the majority social class of each neighborhood. \n",
"\n",
"If the model works well, we may use it to find out a valuable information of neighborhood on cities similar to Belo Horizonte that hasn't a report about their neighborhood prevailing social class."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Data acquisition and cleaning\n",
"\n",
"The report about the Belo Horizonte neighborhood prevailing social classes is published in PDF format. Fortunately, it is very easy to copy the data contents and past into a csv file. The resulting columns are \"Neighborhood\" and \"Class\". Let's see the head of this data set."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AARAO REIS</td>\n",
" <td>low</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>ALTO DOS PINHEIROS</td>\n",
" <td>low</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>ALTO PARAISO</td>\n",
" <td>low</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>ALVARO CAMARGOS</td>\n",
" <td>low</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ALVORADA</td>\n",
" <td>low</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Class\n",
"0 AARAO REIS low\n",
"1 ALTO DOS PINHEIROS low\n",
"2 ALTO PARAISO low\n",
"3 ALVARO CAMARGOS low\n",
"4 ALVORADA low"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"bairros = pd.read_csv('bh_bairros_classes.csv') # it was previously saved\n",
"bairros.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will retrieve the Neighborhood venues with Foursquare API, by calling the \"query\" endpoint for each Neighborhood, which requires localization data. We use geopy library to retrieve localization data of each Neighborhood."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"#!pip install geopy # uncomment if need\n",
"from geopy import Nominatim\n",
"from geopy.exc import GeocoderUnavailable, GeocoderTimedOut, GeocoderServiceError\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"\n",
"def geolocator_belohorizonte(neighborhood): \n",
" try:\n",
" locator = geolocator.geocode(neighborhood +', Belo Horizonte')\n",
" except (GeocoderUnavailable, GeocoderTimedOut, GeocoderServiceError):\n",
" # print('Geocoder unavailable or timed out... will try again!')\n",
" locator = geolocator_belohorizonte(neighborhood)\n",
" return locator"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(245, 4)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Class</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AARAO REIS</td>\n",
" <td>low</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>ALTO DOS PINHEIROS</td>\n",
" <td>low</td>\n",
" <td>-19.932567</td>\n",
" <td>-44.004875</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>ALVARO CAMARGOS</td>\n",
" <td>low</td>\n",
" <td>-19.916339</td>\n",
" <td>-44.007857</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>ALVORADA</td>\n",
" <td>low</td>\n",
" <td>-30.031715</td>\n",
" <td>-51.049711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ANA LUCIA</td>\n",
" <td>low</td>\n",
" <td>-19.887783</td>\n",
" <td>-43.906368</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Class Latitude Longitude\n",
"0 AARAO REIS low -19.847221 -43.919508\n",
"1 ALTO DOS PINHEIROS low -19.932567 -44.004875\n",
"2 ALVARO CAMARGOS low -19.916339 -44.007857\n",
"3 ALVORADA low -30.031715 -51.049711\n",
"4 ANA LUCIA low -19.887783 -43.906368"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(bairros.shape)\n",
"bairros.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The geopy library sometimes can't be accurate, so we had to remove the Neighborhoods that couldn't have its localization data accurately retrieved. The identification of such cases was map manually with a map vizualization support."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<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+ICNtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbLTE5LjkyMjczMTgsLTQzLjk0NTA5NDhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2JjNTY3MWIwOGE5NjQzY2ViNDMzNGVjYjYwMGNiYzg5ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMGVjNjY3ZDAyNjU0MzY0YjE4ODY4NjgwOWQ5YWU2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NDcyMjExMDAwMDAwMDIsLTQzLjkxOTUwODIwMTE1MjYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3ODdmNjE1M2ZkNjQ2ZTU4YTczMmU0NTdkZmJiZmNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0NmRmNzhiMTk1ODQ4NGE5ZTIxNGZjYWQzNDcyMGM1ID0gJCgnPGRpdiBpZD0iaHRtbF9iNDZkZjc4YjE5NTg0ODRhOWUyMTRmY2FkMzQ3MjBjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QUFSQU8gUkVJUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3ODdmNjE1M2ZkNjQ2ZTU4YTczMmU0NTdkZmJiZmNmLnNldENvbnRlbnQoaHRtbF9iNDZkZjc4YjE5NTg0ODRhOWUyMTRmY2FkMzQ3MjBjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMGVjNjY3ZDAyNjU0MzY0YjE4ODY4NjgwOWQ5YWU2MS5iaW5kUG9wdXAocG9wdXBfNTc4N2Y2MTUzZmQ2NDZlNThhNzMyZTQ1N2RmYmJmY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzg5ZTJjNDA5OTk5NDczZmI1YzRlYmQ4N2QwN2YzZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTMyNTY3NCwtNDQuMDA0ODc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmNjcwNjQyNmM1MjRjNzQ5ZWViMTI0ZDU0YTFhNDc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyMTZhN2YwNDVjZTQyNWI5OWY2NjEyM2FhODYxZTdhID0gJCgnPGRpdiBpZD0iaHRtbF8xMjE2YTdmMDQ1Y2U0MjViOTlmNjYxMjNhYTg2MWU3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QUxUTyBET1MgUElOSEVJUk9TIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2Y2NzA2NDI2YzUyNGM3NDllZWIxMjRkNTRhMWE0NzYuc2V0Q29udGVudChodG1sXzEyMTZhN2YwNDVjZTQyNWI5OWY2NjEyM2FhODYxZTdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M4OWUyYzQwOTk5OTQ3M2ZiNWM0ZWJkODdkMDdmM2Q4LmJpbmRQb3B1cChwb3B1cF8zZjY3MDY0MjZjNTI0Yzc0OWVlYjEyNGQ1NGExYTQ3Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTgyNjJiMWQxZTQ0MTE4YmI1ODIxMjQyOGI4NjJjZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MTYzMzg2OTk5OTk5OTcsLTQ0LjAwNzg1NjcwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MzAxZDBmYjg0NWY0Mzg2YWExMGY1N2U0MzkyNGM3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzIzMjRkMTM3YmI0YTQ5ODM4YmY0OWYzOTYwMDIyNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGMyMzI0ZDEzN2JiNGE0OTgzOGJmNDlmMzk2MDAyMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFMVkFSTyBDQU1BUkdPUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzMDFkMGZiODQ1ZjQzODZhYTEwZjU3ZTQzOTI0YzczLnNldENvbnRlbnQoaHRtbF80YzIzMjRkMTM3YmI0YTQ5ODM4YmY0OWYzOTYwMDIyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTgyNjJiMWQxZTQ0MTE4YmI1ODIxMjQyOGI4NjJjZi5iaW5kUG9wdXAocG9wdXBfOTMwMWQwZmI4NDVmNDM4NmFhMTBmNTdlNDM5MjRjNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODE2ZjAyODJhOGY5NGVlZWE5ZDQxMzk3NzUzYTM5NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMzAuMDMxNzE1MDAwMDAwMDAyLC01MS4wNDk3MTEyMDAwMDAwMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjQ1MjA1MmNhOTY5NDRmM2JkMDI2MWJmZjdkYTk0MjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTNlYWM4ZDVmYzU5NGQwNmI0NDQyM2FmMDNhNjhhZDYgPSAkKCc8ZGl2IGlkPSJodG1sXzUzZWFjOGQ1ZmM1OTRkMDZiNDQ0MjNhZjAzYTY4YWQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BTFZPUkFEQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0NTIwNTJjYTk2OTQ0ZjNiZDAyNjFiZmY3ZGE5NDIzLnNldENvbnRlbnQoaHRtbF81M2VhYzhkNWZjNTk0ZDA2YjQ0NDIzYWYwM2E2OGFkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTZmMDI4MmE4Zjk0ZWVlYTlkNDEzOTc3NTNhMzk0NC5iaW5kUG9wdXAocG9wdXBfMjQ1MjA1MmNhOTY5NDRmM2JkMDI2MWJmZjdkYTk0MjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTg2NTQ3ZmIwNjMyNDE4MmJjNWI3NzU5Y2MxM2I4MjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODg3NzgyNSwtNDMuOTA2MzY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExYTQ0NmFhYjE4ZDQ0NThiZTlkMzhhOTAzMTcwOTFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EyZGMxOGM3MTJhZjQyNGM5OGZmOGY1MDdiZTA0N2NkID0gJCgnPGRpdiBpZD0iaHRtbF9hMmRjMThjNzEyYWY0MjRjOThmZjhmNTA3YmUwNDdjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QU5BIExVQ0lBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTFhNDQ2YWFiMThkNDQ1OGJlOWQzOGE5MDMxNzA5MWIuc2V0Q29udGVudChodG1sX2EyZGMxOGM3MTJhZjQyNGM5OGZmOGY1MDdiZTA0N2NkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4NjU0N2ZiMDYzMjQxODJiYzViNzc1OWNjMTNiODI0LmJpbmRQb3B1cChwb3B1cF9hMWE0NDZhYWIxOGQ0NDU4YmU5ZDM4YTkwMzE3MDkxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMzEyOWZjMDgyMGI0ZTM4YmUxOTgxZDA4NGQzNTBiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTQ0MDI3NSwtNDMuOTU2NTE2MTkyMzk3MjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTIwYWNiM2JlZTRhNGZhNzljM2MxMTNkMmI0ZTdkOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjE2OWI4ZDE1YTZhNGE3NDliN2I1ZTlmMTg3MjA2MzcgPSAkKCc8ZGl2IGlkPSJodG1sXzYxNjliOGQxNWE2YTRhNzQ5YjdiNWU5ZjE4NzIwNjM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BUEFSRUNJREEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MjBhY2IzYmVlNGE0ZmE3OWMzYzExM2QyYjRlN2Q4YS5zZXRDb250ZW50KGh0bWxfNjE2OWI4ZDE1YTZhNGE3NDliN2I1ZTlmMTg3MjA2MzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjMxMjlmYzA4MjBiNGUzOGJlMTk4MWQwODRkMzUwYjYuYmluZFBvcHVwKHBvcHVwXzkyMGFjYjNiZWU0YTRmYTc5YzNjMTEzZDJiNGU3ZDhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlMjFjZjZlZjM3ODQ0ZjdhNGQzNzhkN2JkOTc1MGU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5MDc5Mjg5OTk5OTk5NywtNDMuOTYxNjU0OTcwOTkwNjg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3YWJjMzE2Y2VhNTRhZTFiYWI2MGRiMTE5YjZhNDk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzYzA3MGIwODU4ZTQ2MjFiZjM1MGZjYjA1MDQzYjEwID0gJCgnPGRpdiBpZD0iaHRtbF8yM2MwNzBiMDg1OGU0NjIxYmYzNTBmY2IwNTA0M2IxMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVBBUkVDSURBIDdBIFNFQ0FPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODdhYmMzMTZjZWE1NGFlMWJhYjYwZGIxMTliNmE0OTQuc2V0Q29udGVudChodG1sXzIzYzA3MGIwODU4ZTQ2MjFiZjM1MGZjYjA1MDQzYjEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlMjFjZjZlZjM3ODQ0ZjdhNGQzNzhkN2JkOTc1MGU1LmJpbmRQb3B1cChwb3B1cF84N2FiYzMxNmNlYTU0YWUxYmFiNjBkYjExOWI2YTQ5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYzQyNTliNWJhYjI0OTllYWNiNWMzNjU1NmJjNDU1MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NTkwMTE5NSwtNDMuOTk5MDcyMDIyNjU4MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDI5NGMxODVkMjI2NDNkNjg2NWRkYWY5OTUyOGI5YjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWQwNTVhM2YwODEzNDc2YTg5MGMzZWE5NjNiN2YyOTkgPSAkKCc8ZGl2IGlkPSJodG1sXzlkMDU1YTNmMDgxMzQ3NmE4OTBjM2VhOTYzYjdmMjk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CQUlSUk8gREFTIElORFVTVFJJQVMgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMjk0YzE4NWQyMjY0M2Q2ODY1ZGRhZjk5NTI4YjliMy5zZXRDb250ZW50KGh0bWxfOWQwNTVhM2YwODEzNDc2YTg5MGMzZWE5NjNiN2YyOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGM0MjU5YjViYWIyNDk5ZWFjYjVjMzY1NTZiYzQ1NTIuYmluZFBvcHVwKHBvcHVwXzAyOTRjMTg1ZDIyNjQzZDY4NjVkZGFmOTk1MjhiOWIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxZWRiYzM5ZjA2ZjRjYzg4ODNkNGFjMTlhYzBkYTdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkzNDE3NzU1LC00My44OTIzNTE0MTIxMzUzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWYxZDM0OWZkMjlkNGViM2JhM2IxNjExNDU4YmY5ZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2EzYzBiZTRhZDMzNDNkNmFkMDI2NDNiNTAyNWI3MWMgPSAkKCc8ZGl2IGlkPSJodG1sX2NhM2MwYmU0YWQzMzQzZDZhZDAyNjQzYjUwMjViNzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CQUxFSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjFkMzQ5ZmQyOWQ0ZWIzYmEzYjE2MTE0NThiZjlkNy5zZXRDb250ZW50KGh0bWxfY2EzYzBiZTRhZDMzNDNkNmFkMDI2NDNiNTAyNWI3MWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODFlZGJjMzlmMDZmNGNjODg4M2Q0YWMxOWFjMGRhN2YuYmluZFBvcHVwKHBvcHVwX2VmMWQzNDlmZDI5ZDRlYjNiYTNiMTYxMTQ1OGJmOWQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5ODA4NjM0NzQxYjQ4NmU5ZTIyMmQ2MzcyZTVlMTRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk3NzczNzE1MDAwMDAwNiwtNDQuMDE5MjA1MjUzMjIzNDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2M0MThmYzRlZjc0NDAxNmI5MDEwMjg5ODk2ZjA3MzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTJmZmQ1NzQ0YzBiNGQ5ZThkMzJiNWIwZTJkZGMwYTIgPSAkKCc8ZGl2IGlkPSJodG1sX2UyZmZkNTc0NGMwYjRkOWU4ZDMyYjViMGUyZGRjMGEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CQVJSRUlSTyBlIEJBUlJFSVJPIERFIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M0MThmYzRlZjc0NDAxNmI5MDEwMjg5ODk2ZjA3MzEuc2V0Q29udGVudChodG1sX2UyZmZkNTc0NGMwYjRkOWU4ZDMyYjViMGUyZGRjMGEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5ODA4NjM0NzQxYjQ4NmU5ZTIyMmQ2MzcyZTVlMTRmLmJpbmRQb3B1cChwb3B1cF9jYzQxOGZjNGVmNzQ0MDE2YjkwMTAyODk4OTZmMDczMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzE0MTFlM2UwNDE0YTExODAxNTJkZGE1MjNmMjMxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS4zNzc4OTIwMDAwMDAwMDMsLTQzLjU3MDAxNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2JhNmVkM2FjNGY4NGEyNDhmYmI5YmU5MzFiMzdmYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWRhNWFkNzAyMDgyNDY2MmEwMzMzMGU3YzZkMGNhYjcgPSAkKCc8ZGl2IGlkPSJodG1sX2FkYTVhZDcwMjA4MjQ2NjJhMDMzMzBlN2M2ZDBjYWI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DSU1BIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JhNmVkM2FjNGY4NGEyNDhmYmI5YmU5MzFiMzdmYjkuc2V0Q29udGVudChodG1sX2FkYTVhZDcwMjA4MjQ2NjJhMDMzMzBlN2M2ZDBjYWI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3MTQxMWUzZTA0MTRhMTE4MDE1MmRkYTUyM2YyMzFkLmJpbmRQb3B1cChwb3B1cF9jYmE2ZWQzYWM0Zjg0YTI0OGZiYjliZTkzMWIzN2ZiOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjE2OGQ1MGM0YWI0NjE4OWU5Mjc1Y2IzZTM5YjNhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NTg2MTA5LC00My45OTIyMjUxMjM2NzAwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjJlODkxMTA2ZTg0NDZlYmE2ZTA3YTRmZjFmYmJhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTBjODczNWYwOTQ0YWZiOGUzZGM2MDhjN2QxZDFmMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmEwYzg3MzVmMDk0NGFmYjhlM2RjNjA4YzdkMWQxZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJFVEFOSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NjJlODkxMTA2ZTg0NDZlYmE2ZTA3YTRmZjFmYmJhOS5zZXRDb250ZW50KGh0bWxfMmEwYzg3MzVmMDk0NGFmYjhlM2RjNjA4YzdkMWQxZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjIxNjhkNTBjNGFiNDYxODllOTI3NWNiM2UzOWIzYTQuYmluZFBvcHVwKHBvcHVwXzQ2MmU4OTExMDZlODQ0NmViYTZlMDdhNGZmMWZiYmE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjMTZkMWNjNTVhYTQxMjQ5ZDM0MGNjMzk3NGMyOGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5NDA3MTE1LC00My45MDM2NzM4NzIyMjA1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZGNjYzVlOTYwY2U0MjY1YTVhZDRhN2E5Yzk5YTIwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NWU1MzExZjhhYzM0OTI0OTFjYWQyMDUyNTU3NzY3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzVlNTMxMWY4YWMzNDkyNDkxY2FkMjA1MjU1Nzc2NzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJPQSBWSVNUQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkY2NjNWU5NjBjZTQyNjVhNWFkNGE3YTljOTlhMjA3LnNldENvbnRlbnQoaHRtbF83NWU1MzExZjhhYzM0OTI0OTFjYWQyMDUyNTU3NzY3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzE2ZDFjYzU1YWE0MTI0OWQzNDBjYzM5NzRjMjhiMy5iaW5kUG9wdXAocG9wdXBfYmRjY2M1ZTk2MGNlNDI2NWE1YWQ0YTdhOWM5OWEyMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjcxNTEwZjlmOGEyNGNkNGFhODFhOGQ3OTQ0M2I3NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODk1OTU3NywtNDMuOTU0MzkzODIxNDUxMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQwZjlkMDQxNzIxNDVkNjgzMzZlY2RkODRkNDY3MDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjE1NTUwYTI0NzE2NDg0NDkxZDUwMTliNTNiNjk2OWEgPSAkKCc8ZGl2IGlkPSJodG1sX2YxNTU1MGEyNDcxNjQ4NDQ5MWQ1MDE5YjUzYjY5NjlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CT00gSkVTVVMgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDBmOWQwNDE3MjE0NWQ2ODMzNmVjZGQ4NGQ0NjcwMi5zZXRDb250ZW50KGh0bWxfZjE1NTUwYTI0NzE2NDg0NDkxZDUwMTliNTNiNjk2OWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjcxNTEwZjlmOGEyNGNkNGFhODFhOGQ3OTQ0M2I3NDkuYmluZFBvcHVwKHBvcHVwX2U0MGY5ZDA0MTcyMTQ1ZDY4MzM2ZWNkZDg0ZDQ2NzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2NTZhMzhlOGFlMDQwNTViNjk0YTQ5OTUwNGFiY2RlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljc0MTY0MzcsLTQzLjM0NjMyNjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Q2OWM4MjQ4NDk4NDMyZTg2NjRlZjUxODJjYjIwMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDJiNjRmMWMzZDNjNGE3NGE5MTNjOTIwNjY4ODU5NjAgPSAkKCc8ZGl2IGlkPSJodG1sXzAyYjY0ZjFjM2QzYzRhNzRhOTEzYzkyMDY2ODg1OTYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CT00gU1VDRVNTTyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkNjljODI0ODQ5ODQzMmU4NjY0ZWY1MTgyY2IyMDMyLnNldENvbnRlbnQoaHRtbF8wMmI2NGYxYzNkM2M0YTc0YTkxM2M5MjA2Njg4NTk2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjU2YTM4ZThhZTA0MDU1YjY5NGE0OTk1MDRhYmNkZS5iaW5kUG9wdXAocG9wdXBfN2Q2OWM4MjQ4NDk4NDMyZTg2NjRlZjUxODJjYjIwMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzA0NDg2ZGIwYWMwNGYzN2FlNjQyMjk4OGQ4NDVkNGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszLjM4MzE5NzQwMDAwMDAwMDIsLTU5Ljg1OTgxOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI0MTUzMzc3MDEzNDI1NzhlYTI5NGU2Y2ZlNTg2MzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODcyZDhkODlmZjM2NDE3YzlkMjRlZmM5ZmM3YzFhMDUgPSAkKCc8ZGl2IGlkPSJodG1sXzg3MmQ4ZDg5ZmYzNjQxN2M5ZDI0ZWZjOWZjN2MxYTA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CT05GSU0gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MjQxNTMzNzcwMTM0MjU3OGVhMjk0ZTZjZmU1ODYzNy5zZXRDb250ZW50KGh0bWxfODcyZDhkODlmZjM2NDE3YzlkMjRlZmM5ZmM3YzFhMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzA0NDg2ZGIwYWMwNGYzN2FlNjQyMjk4OGQ4NDVkNGQuYmluZFBvcHVwKHBvcHVwXzkyNDE1MzM3NzAxMzQyNTc4ZWEyOTRlNmNmZTU4NjM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0YWU3NjY3YmNhYjQxNDNiMDc1ZDgzZjIxMTcxOWY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk5OTk3NiwtNDQuMDE0NDI5NjY3Mzk1MTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRmNTkwY2ZjNWY4NDIzNmIyZmFlYWE0ZTU3NGVlMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDYzYjQ1MGY4ZjkwNDhmYmJiZWU2ZDQzMWUyNzM5MDUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2M2I0NTBmOGY5MDQ4ZmJiYmVlNmQ0MzFlMjczOTA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CUkFTSUwgSU5EVVNUUklBTCBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0ZjU5MGNmYzVmODQyMzZiMmZhZWFhNGU1NzRlZTM3LnNldENvbnRlbnQoaHRtbF80NjNiNDUwZjhmOTA0OGZiYmJlZTZkNDMxZTI3MzkwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNGFlNzY2N2JjYWI0MTQzYjA3NWQ4M2YyMTE3MTlmOS5iaW5kUG9wdXAocG9wdXBfNDRmNTkwY2ZjNWY4NDIzNmIyZmFlYWE0ZTU3NGVlMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjlkZDAyNDNkMzY0NDQ3ZjlmNTAxNjAyOWVlYzc4MGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQ2MDQ3OCwtNDQuMDAwNDMzMDM5MzcxOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTEwYTVmYTU3MDljNDc0YjkwMzJiMjA1ZmQyZmQ5OTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWFkZTMwZDA3NWQwNDBlOWExZGM4NjUxNGI2NGZmMTcgPSAkKCc8ZGl2IGlkPSJodG1sX2FhZGUzMGQwNzVkMDQwZTlhMWRjODY1MTRiNjRmZjE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DQUJBTkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTBhNWZhNTcwOWM0NzRiOTAzMmIyMDVmZDJmZDk5MS5zZXRDb250ZW50KGh0bWxfYWFkZTMwZDA3NWQwNDBlOWExZGM4NjUxNGI2NGZmMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjlkZDAyNDNkMzY0NDQ3ZjlmNTAxNjAyOWVlYzc4MGIuYmluZFBvcHVwKHBvcHVwXzkxMGE1ZmE1NzA5YzQ3NGI5MDMyYjIwNWZkMmZkOTkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlZGI2ZDNiN2Q3NTQ1YjNiNTIzMDQ4MzQ2NjA0MGU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5MDIwMDMsLTQzLjk0NzQ1NTYwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYmQ5YjAzYjQwMDU0MGVlODM1NjY0ZjFmNmIzYzE0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Yzg2ZGFmMDQzZDA0YmNmYTUyNThjYWJhYjRhNmQ5YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGM4NmRhZjA0M2QwNGJjZmE1MjU4Y2FiYWI0YTZkOWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNBQ0hPRUlSSU5IQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiZDliMDNiNDAwNTQwZWU4MzU2NjRmMWY2YjNjMTQyLnNldENvbnRlbnQoaHRtbF84Yzg2ZGFmMDQzZDA0YmNmYTUyNThjYWJhYjRhNmQ5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZWRiNmQzYjdkNzU0NWIzYjUyMzA0ODM0NjYwNDBlNS5iaW5kUG9wdXAocG9wdXBfY2JkOWIwM2I0MDA1NDBlZTgzNTY2NGYxZjZiM2MxNDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM2M2RmZTdkNGRiNGQ5OGIzM2E5ODFlOGE0YWZjYTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTAzMDA2Mjk5OTk5OTk4LC00My44ODk4Nzg1NDI1MDEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxZDMyMTIxZGNiMzRhZTY4Mjc5YzE3YzYxNzhkMGJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjZDNiNTNlNjgxZDRlMzM4YWY1NDcxMGQ1ZWFjZjQyID0gJCgnPGRpdiBpZD0iaHRtbF9iY2QzYjUzZTY4MWQ0ZTMzOGFmNTQ3MTBkNWVhY2Y0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0FFVEFOTyBGVVJRVUlNIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDFkMzIxMjFkY2IzNGFlNjgyNzljMTdjNjE3OGQwYmIuc2V0Q29udGVudChodG1sX2JjZDNiNTNlNjgxZDRlMzM4YWY1NDcxMGQ1ZWFjZjQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUzNjNkZmU3ZDRkYjRkOThiMzNhOTgxZThhNGFmY2ExLmJpbmRQb3B1cChwb3B1cF8wMWQzMjEyMWRjYjM0YWU2ODI3OWMxN2M2MTc4ZDBiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjRlMTY1NzUxODQ0YWU1YWE1OGNhNTM2MmE5MWQwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MjQ3MzgxOTk5OTk5OTcsLTQ0LjAxMjExMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzIyYjk0NGZjZjNjNGRkZWEzZDIyMGM5OTdiZWU4MmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmMxYTBmYTY1ZGFkNGNhZWJlY2ZjNjQ3ODMxYTMxNDIgPSAkKCc8ZGl2IGlkPSJodG1sX2JjMWEwZmE2NWRhZDRjYWViZWNmYzY0NzgzMWEzMTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DQUxJRk9STklBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzIyYjk0NGZjZjNjNGRkZWEzZDIyMGM5OTdiZWU4MmQuc2V0Q29udGVudChodG1sX2JjMWEwZmE2NWRhZDRjYWViZWNmYzY0NzgzMWEzMTQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyNGUxNjU3NTE4NDRhZTVhYTU4Y2E1MzYyYTkxZDBjLmJpbmRQb3B1cChwb3B1cF9jMjJiOTQ0ZmNmM2M0ZGRlYTNkMjIwYzk5N2JlZTgyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTNjNGIzMGViOTY0NDMwODMwYWZlNzYwNTE5M2VlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDAwNjkzLC00NC4wMTg1NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjg2MmRkNDM2ZDA2NDVhNmI2ZjNkY2E5OGQ4Y2YzNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzk5MjMzMTRlYTAyNDI2NmI0MWRjZWQyMmRkZWVhNWMgPSAkKCc8ZGl2IGlkPSJodG1sXzc5OTIzMzE0ZWEwMjQyNjZiNDFkY2VkMjJkZGVlYTVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DQU1BUkdPUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4NjJkZDQzNmQwNjQ1YTZiNmYzZGNhOThkOGNmMzRhLnNldENvbnRlbnQoaHRtbF83OTkyMzMxNGVhMDI0MjY2YjQxZGNlZDIyZGRlZWE1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYTNjNGIzMGViOTY0NDMwODMwYWZlNzYwNTE5M2VlMi5iaW5kUG9wdXAocG9wdXBfYjg2MmRkNDM2ZDA2NDVhNmI2ZjNkY2E5OGQ4Y2YzNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTBlZTZmOTUxNmM3NGRjZGFkMTQ1NDkwMWUwMWM2NTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODMwMzk5NCwtNDMuOTQ3MDc5MzU0NzQ2ODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkNDUyZTQ5MTY2YzQzMzU5ZjZmOWMyMDVkNmU4ZjAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3MjkzYTNlNDk3MDQxZjFhM2RhZjdjMTg5YzA5ZGQ1ID0gJCgnPGRpdiBpZD0iaHRtbF81NzI5M2EzZTQ5NzA0MWYxYTNkYWY3YzE4OWMwOWRkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0FNUE8gQUxFR1JFIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGQ0NTJlNDkxNjZjNDMzNTlmNmY5YzIwNWQ2ZThmMDAuc2V0Q29udGVudChodG1sXzU3MjkzYTNlNDk3MDQxZjFhM2RhZjdjMTg5YzA5ZGQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwZWU2Zjk1MTZjNzRkY2RhZDE0NTQ5MDFlMDFjNjUyLmJpbmRQb3B1cChwb3B1cF84ZDQ1MmU0OTE2NmM0MzM1OWY2ZjljMjA1ZDZlOGYwMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NjAwNDliYzJiNDk0ZmMxYWU4NTU1YTAyMTRhODEzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS43OTYxNDI4OTk5OTk5OTYsLTQzLjk0NzQzNzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU5ODY3ODcxOWFhNDA5NDg4NjVjZTkxMjQ2ZTI3M2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA0NDBkYmQyOTk3NDZjMTgwODgxYzhiZjE3YjdkZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzgwNDQwZGJkMjk5NzQ2YzE4MDg4MWM4YmYxN2I3ZGRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DQU5BQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1OTg2Nzg3MTlhYTQwOTQ4ODY1Y2U5MTI0NmUyNzNjLnNldENvbnRlbnQoaHRtbF84MDQ0MGRiZDI5OTc0NmMxODA4ODFjOGJmMTdiN2RkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NjAwNDliYzJiNDk0ZmMxYWU4NTU1YTAyMTRhODEzYy5iaW5kUG9wdXAocG9wdXBfNTU5ODY3ODcxOWFhNDA5NDg4NjVjZTkxMjQ2ZTI3M2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjUyMTMwYTJiNmQwNDFlMjlmZmFiYjEwM2I3MGQ1NDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODExNDU4MTAwMDAwMDA3LC00My45NzI0NTA1MzM2NDY1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNDU3ZTViYjFkOGY0ZDIyOTJkOTA3Njg2MDVkZTYzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNmUzM2M4NjA5ZGY0YzhiOWVkMDUxMTY1NjliZjgyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDZlMzNjODYwOWRmNGM4YjllZDA1MTE2NTY5YmY4MmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNBTkRFTEFSSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNDU3ZTViYjFkOGY0ZDIyOTJkOTA3Njg2MDVkZTYzNC5zZXRDb250ZW50KGh0bWxfMDZlMzNjODYwOWRmNGM4YjllZDA1MTE2NTY5YmY4MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjUyMTMwYTJiNmQwNDFlMjlmZmFiYjEwM2I3MGQ1NDcuYmluZFBvcHVwKHBvcHVwXzM0NTdlNWJiMWQ4ZjRkMjI5MmQ5MDc2ODYwNWRlNjM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhMmVjZDc0ZjQ1MDQ0MjhiOGE0OWZjMzQ0Y2U4NDk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgyNzA3MTEsLTQzLjg4Mjg4OTgyMjA2NTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjZmQzNTdjZTBkMzQxMTRiOGZlM2U5ZGQ4MjdmMWY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmMmM4ZjJkMTUwZTQwYzg4YTg4Y2MyYjU2YjgzMzE0ID0gJCgnPGRpdiBpZD0iaHRtbF83ZjJjOGYyZDE1MGU0MGM4OGE4OGNjMmI1NmI4MzMxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0FQSVRBTyBFRFVBUkRPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2NmZDM1N2NlMGQzNDExNGI4ZmUzZTlkZDgyN2YxZjUuc2V0Q29udGVudChodG1sXzdmMmM4ZjJkMTUwZTQwYzg4YTg4Y2MyYjU2YjgzMzE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhMmVjZDc0ZjQ1MDQ0MjhiOGE0OWZjMzQ0Y2U4NDk0LmJpbmRQb3B1cChwb3B1cF9jY2ZkMzU3Y2UwZDM0MTE0YjhmZTNlOWRkODI3ZjFmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDU1OGM3NTE2YTk0YmZkODhjYTQ5OGM3MjQ1ODUwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0yMC4wMDI2MzU2NSwtNDQuMDA3MzgwNDA1ODE1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGZiYjBiZWQ0MzhiNGY4ZGI2NGYxYWZlOGE2YjRhNzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTYzNWI1ZTU1MjA0NGZlMDhiZGIyNTY3ZmMzOTk2MmIgPSAkKCc8ZGl2IGlkPSJodG1sXzk2MzViNWU1NTIwNDRmZTA4YmRiMjU2N2ZjMzk5NjJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DQVJET1NPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGZiYjBiZWQ0MzhiNGY4ZGI2NGYxYWZlOGE2YjRhNzAuc2V0Q29udGVudChodG1sXzk2MzViNWU1NTIwNDRmZTA4YmRiMjU2N2ZjMzk5NjJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0NTU4Yzc1MTZhOTRiZmQ4OGNhNDk4YzcyNDU4NTBkLmJpbmRQb3B1cChwb3B1cF8wZmJiMGJlZDQzOGI0ZjhkYjY0ZjFhZmU4YTZiNGE3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMmQwMGIxMWZlZDA0YWM4OTc3OTBkNDdmN2M2YWI4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MjI3NDk4OTk5OTk5OTgsLTQ0LjAwMzk3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBiNTQzN2QxMjEzNDAyOWI5NzkwOTMwMDY4MDJlOGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWQ0ZDU1ZTJiMmIyNGJjZjk5ZWMzOTYyMGZjZmQ4ZDQgPSAkKCc8ZGl2IGlkPSJodG1sXzVkNGQ1NWUyYjJiMjRiY2Y5OWVjMzk2MjBmY2ZkOGQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DRVUgQVpVTCBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwYjU0MzdkMTIxMzQwMjliOTc5MDkzMDA2ODAyZThmLnNldENvbnRlbnQoaHRtbF81ZDRkNTVlMmIyYjI0YmNmOTllYzM5NjIwZmNmZDhkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMmQwMGIxMWZlZDA0YWM4OTc3OTBkNDdmN2M2YWI4ZS5iaW5kUG9wdXAocG9wdXBfYTBiNTQzN2QxMjEzNDAyOWI5NzkwOTMwMDY4MDJlOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTRlZDk3MmQ5NjAxNDdkYmE0NmU2ZTA3ZWU0ZTU1ZmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODM1NzI1NTUsLTQzLjk5MDUyMzI1NDcxODg0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOTAyMzg0YjQwYjk0Y2RhODc2MjMzYjc5MmE1NzIxZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MmY3OWVkNGRiYjM0ODE0YWY3ZGU3OWM1Mjg1OGRjNSA9ICQoJzxkaXYgaWQ9Imh0bWxfODJmNzllZDRkYmIzNDgxNGFmN2RlNzljNTI4NThkYzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNPUEFDQUJBTkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOTAyMzg0YjQwYjk0Y2RhODc2MjMzYjc5MmE1NzIxZi5zZXRDb250ZW50KGh0bWxfODJmNzllZDRkYmIzNDgxNGFmN2RlNzljNTI4NThkYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTRlZDk3MmQ5NjAxNDdkYmE0NmU2ZTA3ZWU0ZTU1ZmUuYmluZFBvcHVwKHBvcHVwX2Q5MDIzODRiNDBiOTRjZGE4NzYyMzNiNzkyYTU3MjFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4MzA1OGI4NzVmMDQ2NGViMDUxY2IxODE3NTgzODQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkwMDM3ODM5OTk5OTk5NywtNDQuMDIxMjM4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWYwOTE3YmFjNDg0MjFmYTkzYWJmZjIwZTZiZmRhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDdkYjA1YWEzZWE0NWMyYjkyZjIwNWRjYzM1Y2Q5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQ3ZGIwNWFhM2VhNDVjMmI5MmYyMDVkY2MzNWNkOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNPUVVFSVJPUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhZjA5MTdiYWM0ODQyMWZhOTNhYmZmMjBlNmJmZGE0LnNldENvbnRlbnQoaHRtbF9mNDdkYjA1YWEzZWE0NWMyYjkyZjIwNWRjYzM1Y2Q5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ODMwNThiODc1ZjA0NjRlYjA1MWNiMTgxNzU4Mzg0NC5iaW5kUG9wdXAocG9wdXBfZWFmMDkxN2JhYzQ4NDIxZmE5M2FiZmYyMGU2YmZkYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2M0ZTA5YWM0ZGUyNGMxMmFkZjAxMjM3Yzc3ZjA0NzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTkyNDIyMDUsLTQ0LjAxOTIxMTYxNzg3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyZTc0YTQ1OWYxNTRlMDViM2E3MDFlZmZkYmUxM2Q5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhNTBmYzliMWI0ZjQwNTZhMGFhYzk4YWVkZDVhZWYxID0gJCgnPGRpdiBpZD0iaHRtbF9lYTUwZmM5YjFiNGY0MDU2YTBhYWM5OGFlZGQ1YWVmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RElBTUFOVEUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MmU3NGE0NTlmMTU0ZTA1YjNhNzAxZWZmZGJlMTNkOS5zZXRDb250ZW50KGh0bWxfZWE1MGZjOWIxYjRmNDA1NmEwYWFjOThhZWRkNWFlZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2M0ZTA5YWM0ZGUyNGMxMmFkZjAxMjM3Yzc3ZjA0NzUuYmluZFBvcHVwKHBvcHVwXzcyZTc0YTQ1OWYxNTRlMDViM2E3MDFlZmZkYmUxM2Q5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3Yjk5NGQyZTQzNzRhNDRhYzE3MTgwOTU1ZDg4YmI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkxNTg1ODIsLTQzLjk5OTU3NTEwMTI1ODc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0YWU0YjgyMjEyNTQyZGFiYjYxZDdhNmJlYmFmMGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0NTViZjYwYmY2OTRlYzI4ZWMwYmM2YzYwZTUzMmU4ID0gJCgnPGRpdiBpZD0iaHRtbF84NDU1YmY2MGJmNjk0ZWMyOGVjMGJjNmM2MGU1MzJlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RE9NIEJPU0NPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRhZTRiODIyMTI1NDJkYWJiNjFkN2E2YmViYWYwY2Quc2V0Q29udGVudChodG1sXzg0NTViZjYwYmY2OTRlYzI4ZWMwYmM2YzYwZTUzMmU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3Yjk5NGQyZTQzNzRhNDRhYzE3MTgwOTU1ZDg4YmI4LmJpbmRQb3B1cChwb3B1cF84NGFlNGI4MjIxMjU0MmRhYmI2MWQ3YTZiZWJhZjBjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xM2VjYzc5YTA2MWU0MTZhYmI5NjBhYmExNThmZGRlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzY5NDA1NSwtNDMuOTE3MTM2Mjg4ODU1MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I2NjkzNjFjMWFjMjRjZDZiMGJjMDQ0ZTcyMzBhN2FiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1OWU1NzNlMWExYjRkNzhhMDk2Njg5M2ZhNjEzZTRjID0gJCgnPGRpdiBpZD0iaHRtbF9lNTllNTczZTFhMWI0ZDc4YTA5NjY4OTNmYTYxM2U0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RE9NIEpPQVFVSU0gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjY5MzYxYzFhYzI0Y2Q2YjBiYzA0NGU3MjMwYTdhYi5zZXRDb250ZW50KGh0bWxfZTU5ZTU3M2UxYTFiNGQ3OGEwOTY2ODkzZmE2MTNlNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTNlY2M3OWEwNjFlNDE2YWJiOTYwYWJhMTU4ZmRkZTguYmluZFBvcHVwKHBvcHVwX2I2NjkzNjFjMWFjMjRjZDZiMGJjMDQ0ZTcyMzBhN2FiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyOTEyNGRhNWU4OTRkYjE5Mzc2MDU2ODU3YmI1NTI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg1NDU5MTE1LC00My45MDQ1OTU0NzQ2MDQ2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwOTE5MzIwMzI3YzQ1ZDg4YzQ3ZGY4OGIzNzg2M2MwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4NDRiMDNkZWFmYzRiODM5Y2RmOGNjNjA3OTdhMzY3ID0gJCgnPGRpdiBpZD0iaHRtbF83ODQ0YjAzZGVhZmM0YjgzOWNkZjhjYzYwNzk3YTM2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RE9NIFNJTFZFUklPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjA5MTkzMjAzMjdjNDVkODhjNDdkZjg4YjM3ODYzYzAuc2V0Q29udGVudChodG1sXzc4NDRiMDNkZWFmYzRiODM5Y2RmOGNjNjA3OTdhMzY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyOTEyNGRhNWU4OTRkYjE5Mzc2MDU2ODU3YmI1NTI5LmJpbmRQb3B1cChwb3B1cF9iMDkxOTMyMDMyN2M0NWQ4OGM0N2RmODhiMzc4NjNjMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjhkYTdiNGYxMGU0NGQ3ODc3MjdkMDFhMTY1YjIxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44ODcyNzU0NSwtNDMuOTc1NDE5MTkxOTY5NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTNiNWNiNmRjNjZhNGM3ZmI5NGQ5NmIxNmU2M2M0NWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTU4MGEwYTNiN2YyNGFjN2FhYzE2MDM5YTc1MTRjZjEgPSAkKCc8ZGl2IGlkPSJodG1sX2U1ODBhMGEzYjdmMjRhYzdhYWMxNjAzOWE3NTE0Y2YxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FTkdFTkhPIE5PR1VFSVJBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTNiNWNiNmRjNjZhNGM3ZmI5NGQ5NmIxNmU2M2M0NWYuc2V0Q29udGVudChodG1sX2U1ODBhMGEzYjdmMjRhYzdhYWMxNjAzOWE3NTE0Y2YxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyOGRhN2I0ZjEwZTQ0ZDc4NzcyN2QwMWExNjViMjFlLmJpbmRQb3B1cChwb3B1cF8xM2I1Y2I2ZGM2NmE0YzdmYjk0ZDk2YjE2ZTYzYzQ1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGZkZmQ3NTc2NTk0MTdmOTc1OWFiYjRmZDVkM2ZmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44ODY5MTYxOTk5OTk5OTgsLTQzLjk1OTk5NTMxNDg4NDg2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMTY0YmZiYjVjMmM0YzVkODkzYTQ5OWM3MWRlY2U1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmQ3ZDVmYzViZjE0ZmU1YmMxMWYwNmRhN2Y4MGM3NSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWJkN2Q1ZmM1YmYxNGZlNWJjMTFmMDZkYTdmODBjNzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVSTUVMSU5EQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxNjRiZmJiNWMyYzRjNWQ4OTNhNDk5YzcxZGVjZTU4LnNldENvbnRlbnQoaHRtbF9lYmQ3ZDVmYzViZjE0ZmU1YmMxMWYwNmRhN2Y4MGM3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OGZkZmQ3NTc2NTk0MTdmOTc1OWFiYjRmZDVkM2ZmNi5iaW5kUG9wdXAocG9wdXBfZTE2NGJmYmI1YzJjNGM1ZDg5M2E0OTljNzFkZWNlNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDljZDZiODc5Y2E5NGM2MmJhNGM1YjY1ZDBiYWY2OTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODYzOTc2NiwtNDQuMDI0NjIyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjE1ZWNjYjcxM2I0ODY2OTViMWVhOTNhY2UyOGNjMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYzI5NGZlYTM5ZjU0NDgzOTViODdhMWUyNjA3Nzc3NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWMyOTRmZWEzOWY1NDQ4Mzk1Yjg3YTFlMjYwNzc3NzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVTVFJFTEEgREFMVkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjE1ZWNjYjcxM2I0ODY2OTViMWVhOTNhY2UyOGNjMS5zZXRDb250ZW50KGh0bWxfMWMyOTRmZWEzOWY1NDQ4Mzk1Yjg3YTFlMjYwNzc3NzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDljZDZiODc5Y2E5NGM2MmJhNGM1YjY1ZDBiYWY2OTQuYmluZFBvcHVwKHBvcHVwXzZiMTVlY2NiNzEzYjQ4NjY5NWIxZWE5M2FjZTI4Y2MxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiMjZlNTdkN2QxMTQyMGZiZGIyZGE2YWM0Y2ZiYWExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgxMTUwMTMsLTQzLjkzNDUyOTE3MjQ1MjA5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZWI3ZGExNjYyODI0N2IyOWNiMTc2MTZiODQ2OTJmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDc5MDBiZjA5ZWY0MTk1OTM2YWIxMzYxYzQ2NjY3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzQ3OTAwYmYwOWVmNDE5NTkzNmFiMTM2MWM0NjY2N2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVURUxWSU5BIENBUk5FSVJPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmViN2RhMTY2MjgyNDdiMjljYjE3NjE2Yjg0NjkyZjEuc2V0Q29udGVudChodG1sX2M0NzkwMGJmMDllZjQxOTU5MzZhYjEzNjFjNDY2NjdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiMjZlNTdkN2QxMTQyMGZiZGIyZGE2YWM0Y2ZiYWExLmJpbmRQb3B1cChwb3B1cF9iZWI3ZGExNjYyODI0N2IyOWNiMTc2MTZiODQ2OTJmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mY2Y2YWJjMmUyMTY0Mzk0YTY1MTYxZTY5MTliMjJjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NjI3NjkwNSwtNDMuOTE4NjczODIyODk0OTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIxOGZjN2IxNmM1YTQ1YmZhYzg5MzUzY2Q4NWM2NzYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjNjhhYmE2MmQzYjQyYjA4M2RmZjI0MTU1MjU1YTcxID0gJCgnPGRpdiBpZD0iaHRtbF9hYzY4YWJhNjJkM2I0MmIwODNkZmYyNDE1NTI1NWE3MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RVlNQVJEIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjE4ZmM3YjE2YzVhNDViZmFjODkzNTNjZDg1YzY3NjEuc2V0Q29udGVudChodG1sX2FjNjhhYmE2MmQzYjQyYjA4M2RmZjI0MTU1MjU1YTcxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjZjZhYmMyZTIxNjQzOTRhNjUxNjFlNjkxOWIyMmNjLmJpbmRQb3B1cChwb3B1cF8yMThmYzdiMTZjNWE0NWJmYWM4OTM1M2NkODVjNjc2MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMmQ5YjhmMDk3OTk0MWQ4YWU3NjkyZTcxODgzNjk5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzI0NDQxNSwtNDMuOTE3NDEyMDIxOTkzMTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzU4NjRmOTQ3OWUyNGI0M2ExZWYwZGJmNDZiZTUwMTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA1NWY3NjAwMmZkNDk5Nzg2OTljMmUxZGU1YjRlOGEgPSAkKCc8ZGl2IGlkPSJodG1sX2YwNTVmNzYwMDJmZDQ5OTc4Njk5YzJlMWRlNWI0ZThhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GRVJOQU8gRElBUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1ODY0Zjk0NzllMjRiNDNhMWVmMGRiZjQ2YmU1MDEyLnNldENvbnRlbnQoaHRtbF9mMDU1Zjc2MDAyZmQ0OTk3ODY5OWMyZTFkZTViNGU4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMmQ5YjhmMDk3OTk0MWQ4YWU3NjkyZTcxODgzNjk5Ny5iaW5kUG9wdXAocG9wdXBfNzU4NjRmOTQ3OWUyNGI0M2ExZWYwZGJmNDZiZTUwMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzg2NGVhY2NlMWMwNGU5MWE3OGIwMTgzZjI1YmUxNzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTk0NzQzMDUsLTQzLjk5OTkwODI3ODU2ODAzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZmNhYjM5OTMyNDE0OTU3OTRlN2ZhYWFhZTNjOGU3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZjU1ZTJkYjNmZmM0ZTQ3YmM3ZGY5MTQ3NGU2NzMwOCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2Y1NWUyZGIzZmZjNGU0N2JjN2RmOTE0NzRlNjczMDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZMQVZJTyBNQVJRVUVTIExJU0JPQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmY2FiMzk5MzI0MTQ5NTc5NGU3ZmFhYWFlM2M4ZTdhLnNldENvbnRlbnQoaHRtbF8zZjU1ZTJkYjNmZmM0ZTQ3YmM3ZGY5MTQ3NGU2NzMwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODY0ZWFjY2UxYzA0ZTkxYTc4YjAxODNmMjViZTE3OC5iaW5kUG9wdXAocG9wdXBfZGZjYWIzOTkzMjQxNDk1Nzk0ZTdmYWFhYWUzYzhlN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTc0ZGMxOWZhZTFhNDkxYzg2NDQwYWYxZTU2YmI4ZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODM3MTAyNzUsLTQzLjkzNDg2MjQ4NDIzNzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1MmE3NzRhMzQ4NjQ1NTRhOWUwZjAyNGRkMTcyZjA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxYzNhYzJjODNkYjQwMDI5M2M3MGE2MWFjNTE3NTBmID0gJCgnPGRpdiBpZD0iaHRtbF82MWMzYWMyYzgzZGI0MDAyOTNjNzBhNjFhYzUxNzUwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RkxPUkFNQVIgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NTJhNzc0YTM0ODY0NTU0YTllMGYwMjRkZDE3MmYwNy5zZXRDb250ZW50KGh0bWxfNjFjM2FjMmM4M2RiNDAwMjkzYzcwYTYxYWM1MTc1MGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTc0ZGMxOWZhZTFhNDkxYzg2NDQwYWYxZTU2YmI4ZjUuYmluZFBvcHVwKHBvcHVwXzg1MmE3NzRhMzQ4NjQ1NTRhOWUwZjAyNGRkMTcyZjA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiYWEyYzRmZTU3OTQ1NWVhY2RkODZmOTY2NzUwOWNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkwNzE3OTMsLTQ0LjAwMTcxOThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RiZGU2OWE1NmNiNGI4Yjg0NjY1M2U2OGJiNjE0MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA3NjQxNWM5YmFiNGM2MmFlNGYyODAyODhhMmU5NGYgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNzY0MTVjOWJhYjRjNjJhZTRmMjgwMjg4YTJlOTRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkVJIEVVU1RBUVVJTyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkYmRlNjlhNTZjYjRiOGI4NDY2NTNlNjhiYjYxNDAzLnNldENvbnRlbnQoaHRtbF83MDc2NDE1YzliYWI0YzYyYWU0ZjI4MDI4OGEyZTk0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YmFhMmM0ZmU1Nzk0NTVlYWNkZDg2Zjk2Njc1MDljZS5iaW5kUG9wdXAocG9wdXBfY2RiZGU2OWE1NmNiNGI4Yjg0NjY1M2U2OGJiNjE0MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWI1ZWJjMmM2ZmU5NGM5NmFlMWFlYjJkNjNlYWE5MDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODA3NzA4Mzk5OTk5OTk2LC00My45Mzc4NDE3NTAzMTgzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2Y0YTI5ZTIzYjA0MDAzYTQ4ZjMzZGViYzcwYWZiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Yjk2OGJkMTE0Mjg0Mzk1ODk3NTVkYzA1MjYzNmM1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI5NjhiZDExNDI4NDM5NTg5NzU1ZGMwNTI2MzZjNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZSRUkgTEVPUE9MRE8gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83M2Y0YTI5ZTIzYjA0MDAzYTQ4ZjMzZGViYzcwYWZiYi5zZXRDb250ZW50KGh0bWxfNmI5NjhiZDExNDI4NDM5NTg5NzU1ZGMwNTI2MzZjNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWI1ZWJjMmM2ZmU5NGM5NmFlMWFlYjJkNjNlYWE5MDkuYmluZFBvcHVwKHBvcHVwXzczZjRhMjllMjNiMDQwMDNhNDhmMzNkZWJjNzBhZmJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0OGJlNzAxYTU3NTQyODY4YmMwMDQxYjk2YzBiY2I4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkzMjUyMDgwMDAwMDAwMiwtNDMuOTg4NjEzNjU2MTY5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWJiMmUzNTE1N2RmNDc0NzkzNmViODlkYWUzM2EyMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmZlNDM3MzNkNDM1NDkxZGEyZGFhODkwNzg0NWZjNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzZmZTQzNzMzZDQzNTQ5MWRhMmRhYTg5MDc4NDVmYzQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HQU1FTEVJUkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYmIyZTM1MTU3ZGY0NzQ3OTM2ZWI4OWRhZTMzYTIxYi5zZXRDb250ZW50KGh0bWxfNmZlNDM3MzNkNDM1NDkxZGEyZGFhODkwNzg0NWZjNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTQ4YmU3MDFhNTc1NDI4NjhiYzAwNDFiOTZjMGJjYjguYmluZFBvcHVwKHBvcHVwX2FiYjJlMzUxNTdkZjQ3NDc5MzZlYjg5ZGFlMzNhMjFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzYmExOWE1YmRiNTQ5MWQ4OTM0MmMwNmYxNTIxNWY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk0NTA1MDMsLTQ0LjAwOTQ0NjIwMDAwMDAwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNmY0ZDlmODQzZmY0YmFkYWI4MTFmYzgxZmVlMDE1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNGJlYTBhYjI4MmE0NTJlOTA4ZmZkODAwODU0YmNjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTRiZWEwYWIyODJhNDUyZTkwOGZmZDgwMDg1NGJjYzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdMQUxJSkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNmY0ZDlmODQzZmY0YmFkYWI4MTFmYzgxZmVlMDE1Zi5zZXRDb250ZW50KGh0bWxfZTRiZWEwYWIyODJhNDUyZTkwOGZmZDgwMDg1NGJjYzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTNiYTE5YTViZGI1NDkxZDg5MzQyYzA2ZjE1MjE1ZjUuYmluZFBvcHVwKHBvcHVwXzM2ZjRkOWY4NDNmZjRiYWRhYjgxMWZjODFmZWUwMTVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdlNTY1Nzk0MjEwNDRiZGU4ODgzY2RlNmRiNjUzYzU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5ODM4MzEsLTQ0LjAxNDE0ODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjJiZjg3M2YwMmVjNGU0NjgzZWVlMjhjZDM0NWQ0NGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWJhNWNiZDM5YWY4NGJkYTk0N2Y5ZTkxYWFmNmViOGYgPSAkKCc8ZGl2IGlkPSJodG1sXzliYTVjYmQzOWFmODRiZGE5NDdmOWU5MWFhZjZlYjhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HTE9SSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMmJmODczZjAyZWM0ZTQ2ODNlZWUyOGNkMzQ1ZDQ0ZC5zZXRDb250ZW50KGh0bWxfOWJhNWNiZDM5YWY4NGJkYTk0N2Y5ZTkxYWFmNmViOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2U1NjU3OTQyMTA0NGJkZTg4ODNjZGU2ZGI2NTNjNTQuYmluZFBvcHVwKHBvcHVwX2YyYmY4NzNmMDJlYzRlNDY4M2VlZTI4Y2QzNDVkNDRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0Y2Q0ZDk1OTY1OTQ3MTI4ZmIwNzkyYmM2NmJiY2YxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg2NTcwMTEwMDAwMDAwNiwtNDMuOTAwMDg5MjU4NDY0MzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxNWRlMDQzNjJjNTRhMGM4YTE3MWIzOTA1MDFjMjFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiNWZmMDIzNjdjOTRlYWFiMmFhNjVlOWRiZWMzZmM3ID0gJCgnPGRpdiBpZD0iaHRtbF9hYjVmZjAyMzY3Yzk0ZWFhYjJhYTY1ZTlkYmVjM2ZjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R09JQU5JQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxNWRlMDQzNjJjNTRhMGM4YTE3MWIzOTA1MDFjMjFkLnNldENvbnRlbnQoaHRtbF9hYjVmZjAyMzY3Yzk0ZWFhYjJhYTY1ZTlkYmVjM2ZjNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NGNkNGQ5NTk2NTk0NzEyOGZiMDc5MmJjNjZiYmNmMS5iaW5kUG9wdXAocG9wdXBfMzE1ZGUwNDM2MmM1NGEwYzhhMTcxYjM5MDUwMWMyMWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ZmNTlkMTQ4YjRiNGUxY2I3ODdmNjI3YTIxY2U0YzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAuMjEwNDY5Njk5OTk5OTk3LC00NC4wMDMzNTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMzVjN2JkNmFkNjQzZTFhZjRlMTBjMTI4ZDNjNGIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkODYwNWVkNWU5NTQ2MWU4ZWQzZmY1NjhhNDRmYmMyID0gJCgnPGRpdiBpZD0iaHRtbF8zZDg2MDVlZDVlOTU0NjFlOGVkM2ZmNTY4YTQ0ZmJjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R09SRFVSQVMgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTM1YzdiZDZhZDY0M2UxYWY0ZTEwYzEyOGQzYzRiMy5zZXRDb250ZW50KGh0bWxfM2Q4NjA1ZWQ1ZTk1NDYxZThlZDNmZjU2OGE0NGZiYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ZmNTlkMTQ4YjRiNGUxY2I3ODdmNjI3YTIxY2U0YzkuYmluZFBvcHVwKHBvcHVwXzAxMzVjN2JkNmFkNjQzZTFhZjRlMTBjMTI4ZDNjNGIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlNzVkMzExOGI3NjQzNzQ4MmNhZjRkMTEyZGM0NmM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg0NDEwNDU1LC00My45MjU1MzQzMjMzOTcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMWQ2MmRiYTQ3YmM0ODI3YTBhYzBlYmI3ODM1NTZkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDY0M2MyYjI4OTU0YmFkYjllYmIyZjg1ZTVlOWM1MyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQ2NDNjMmIyODk1NGJhZGI5ZWJiMmY4NWU1ZTljNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdVQVJBTkkgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMWQ2MmRiYTQ3YmM0ODI3YTBhYzBlYmI3ODM1NTZkYy5zZXRDb250ZW50KGh0bWxfYjQ2NDNjMmIyODk1NGJhZGI5ZWJiMmY4NWU1ZTljNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmU3NWQzMTE4Yjc2NDM3NDgyY2FmNGQxMTJkYzQ2YzYuYmluZFBvcHVwKHBvcHVwXzMxZDYyZGJhNDdiYzQ4MjdhMGFjMGViYjc4MzU1NmRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1YTNmZTc5MmE4YzQ5YzM4NDhjNGExYmU5YjY5OTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk1Mzg4MTM5OTk5OTk5NywtNDMuOTc4NzI5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwNWVjNmQxYWQ2MDRhYjZiNDZhMDZmOWI2OTczYTNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmNTg2NDQ1N2Y3NjQ5MGZhZDRlNTEzNjA0MzkzZDM3ID0gJCgnPGRpdiBpZD0iaHRtbF80ZjU4NjQ0NTdmNzY0OTBmYWQ0ZTUxMzYwNDM5M2QzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SEFWQUkgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDVlYzZkMWFkNjA0YWI2YjQ2YTA2ZjliNjk3M2EzZi5zZXRDb250ZW50KGh0bWxfNGY1ODY0NDU3Zjc2NDkwZmFkNGU1MTM2MDQzOTNkMzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzVhM2ZlNzkyYThjNDljMzg0OGM0YTFiZTliNjk5MTUuYmluZFBvcHVwKHBvcHVwX2QwNWVjNmQxYWQ2MDRhYjZiNDZhMDZmOWI2OTczYTNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0NmNlNzY3MGFmMTRkODk5OTYyYzg4YWI0ZjU3Zjc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg0MTY5MzY1LC00My45MzgxMzQ5NTk1NDYzOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmIxYTY2ODMzYTQwNDhlYzk1YmNjMTgzZTJkZWU3ZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQwZmM5MDk2NzNmNDU0ZDg2YjM1YjM2MDM2MmQwNmEgPSAkKCc8ZGl2IGlkPSJodG1sXzY0MGZjOTA5NjczZjQ1NGQ4NmIzNWIzNjAzNjJkMDZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IRUxJT1BPTElTIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmIxYTY2ODMzYTQwNDhlYzk1YmNjMTgzZTJkZWU3ZTQuc2V0Q29udGVudChodG1sXzY0MGZjOTA5NjczZjQ1NGQ4NmIzNWIzNjAzNjJkMDZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0NmNlNzY3MGFmMTRkODk5OTYyYzg4YWI0ZjU3Zjc2LmJpbmRQb3B1cChwb3B1cF9iYjFhNjY4MzNhNDA0OGVjOTViY2MxODNlMmRlZTdlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Y2MzMzc2MzYxOTc0MDQ2YjZhOWNiN2UwNWQ2MjY3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MDIxNzMyNSwtNDMuOTQ2NjkxNzI5MDQ1MDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzM5Zjc5NDhmOTdiNDg0Mzg0ZThlMDk5YzJhNzQ2ODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTg2N2VhMDEyMGI0NGFkY2JiMGQwZGZmZmVmNDE3ZDQgPSAkKCc8ZGl2IGlkPSJodG1sX2U4NjdlYTAxMjBiNDRhZGNiYjBkMGRmZmZlZjQxN2Q0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JQVBJIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzM5Zjc5NDhmOTdiNDg0Mzg0ZThlMDk5YzJhNzQ2ODAuc2V0Q29udGVudChodG1sX2U4NjdlYTAxMjBiNDRhZGNiYjBkMGRmZmZlZjQxN2Q0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjYzMzNzYzNjE5NzQwNDZiNmE5Y2I3ZTA1ZDYyNjcxLmJpbmRQb3B1cChwb3B1cF8zMzlmNzk0OGY5N2I0ODQzODRlOGUwOTljMmE3NDY4MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZjY3MjAwMDk5MDg0YzRiOWEwODAzNTJkZDM0N2ViZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MDY5Mjc3LC00My45OTgxMzEzMTI5NTE1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjA4YTlmNTM1N2Q0ZjcwYWJlZTdjY2YzOTZjOWRiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZDE1NjJlMGQyNDQ0YTY3YTJhZjIzNDBkNDk5OTk2ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWQxNTYyZTBkMjQ0NGE2N2EyYWYyMzQwZDQ5OTk5NmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklOQ09ORklERU5DSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMjA4YTlmNTM1N2Q0ZjcwYWJlZTdjY2YzOTZjOWRiOS5zZXRDb250ZW50KGh0bWxfYWQxNTYyZTBkMjQ0NGE2N2EyYWYyMzQwZDQ5OTk5NmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmY2NzIwMDA5OTA4NGM0YjlhMDgwMzUyZGQzNDdlYmQuYmluZFBvcHVwKHBvcHVwXzAyMDhhOWY1MzU3ZDRmNzBhYmVlN2NjZjM5NmM5ZGI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1NzkyZDNlNmEzNjQ0NDM5NmRiNGMwYjQyNjY4YjkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIwLjAxOTI2OTI1LC00NC4wMzM1NTIyMjgzMzA0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZjFhZDNlZTk2YmE0ZDI0ODk0NDllMzZiMzZjNDU5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTRlNWFhNzA4ZWI0MDM0YTY0N2Y3ZjIxMzZiNzUyNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE0ZTVhYTcwOGViNDAzNGE2NDdmN2YyMTM2Yjc1MjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklOREVQRU5ERU5DSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjFhZDNlZTk2YmE0ZDI0ODk0NDllMzZiMzZjNDU5NS5zZXRDb250ZW50KGh0bWxfZDE0ZTVhYTcwOGViNDAzNGE2NDdmN2YyMTM2Yjc1MjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDU3OTJkM2U2YTM2NDQ0Mzk2ZGI0YzBiNDI2NjhiOTEuYmluZFBvcHVwKHBvcHVwXzBmMWFkM2VlOTZiYTRkMjQ4OTQ0OWUzNmIzNmM0NTk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjOWNkMjUwOTExNTQ1ZTI4MjlhYmVmNTUyNTE5YmMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgxNzgxNzQsLTQzLjg5MjY0MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWU0ZjBmZWMxZmVjNGUzNjljZDM4Mjg1ZjRkMGU2ZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2ZlY2FmZjc1OTEzNDQ4NmEwODA0M2QwZGViMmY3YWEgPSAkKCc8ZGl2IGlkPSJodG1sX2NmZWNhZmY3NTkxMzQ0ODZhMDgwNDNkMGRlYjJmN2FhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JTkRVU1RSSUFMIFJPRFJJR1VFUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllNGYwZmVjMWZlYzRlMzY5Y2QzODI4NWY0ZDBlNmRmLnNldENvbnRlbnQoaHRtbF9jZmVjYWZmNzU5MTM0NDg2YTA4MDQzZDBkZWIyZjdhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYzljZDI1MDkxMTU0NWUyODI5YWJlZjU1MjUxOWJjMy5iaW5kUG9wdXAocG9wdXBfOWU0ZjBmZWMxZmVjNGUzNjljZDM4Mjg1ZjRkMGU2ZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ2NjkyYzI4NzgwNDRiODhjZDM0MDRjZWQ5ZDA1NDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTY3OTI2MzAwMDAwMDAyLC00My45NzcwODMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxYjZiODNmOGY4MzQ2NjY5NGZmN2JmODU5YjcxMDg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3YWYyY2JlM2VkNzQ1ZTA4YmFlYjMyZWJmODk2NjNjID0gJCgnPGRpdiBpZD0iaHRtbF9jN2FmMmNiZTNlZDc0NWUwOGJhZWIzMmViZjg5NjYzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q1VOSEEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MWI2YjgzZjhmODM0NjY2OTRmZjdiZjg1OWI3MTA4Ny5zZXRDb250ZW50KGh0bWxfYzdhZjJjYmUzZWQ3NDVlMDhiYWViMzJlYmY4OTY2M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWQ2NjkyYzI4NzgwNDRiODhjZDM0MDRjZWQ5ZDA1NDEuYmluZFBvcHVwKHBvcHVwXzYxYjZiODNmOGY4MzQ2NjY5NGZmN2JmODU5YjcxMDg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExMTAxYmM2ZWNmZDQ2NDBiOTI0ZTMxMzlmZjlmNTg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkxMjAyMTM5OTk5OTk5NywtNDMuOTk4NTIyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMWM1NTAwNzljMTQ0OTNlOWY3ODc4MjMxMTFjZDdlMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjQyMWRhMTBkNGM0ZTczYWM3OTI0MTI4MmNhNjk3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGI0MjFkYTEwZDRjNGU3M2FjNzkyNDEyODJjYTY5N2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklQQU5FTUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMWM1NTAwNzljMTQ0OTNlOWY3ODc4MjMxMTFjZDdlMS5zZXRDb250ZW50KGh0bWxfMGI0MjFkYTEwZDRjNGU3M2FjNzkyNDEyODJjYTY5N2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTExMDFiYzZlY2ZkNDY0MGI5MjRlMzEzOWZmOWY1ODcuYmluZFBvcHVwKHBvcHVwX2UxYzU1MDA3OWMxNDQ5M2U5Zjc4NzgyMzExMWNkN2UxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhODEyYjcyY2Q5ZDQ5NWJiZmVhYWIwMmMyYzI5ODlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg4MTc3NDYsLTQzLjkzMjI2NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTMwOTRkZTE4MjlhNDYzNTlmM2MwNWY4MzUxYWU0ZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRlYzU5MWY4N2FlNDBmYzgzZWQwOGNlNTdjZTY4ZGYgPSAkKCc8ZGl2IGlkPSJodG1sXzI0ZWM1OTFmODdhZTQwZmM4M2VkMDhjZTU3Y2U2OGRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JUElSQU5HQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzMDk0ZGUxODI5YTQ2MzU5ZjNjMDVmODM1MWFlNGU4LnNldENvbnRlbnQoaHRtbF8yNGVjNTkxZjg3YWU0MGZjODNlZDA4Y2U1N2NlNjhkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYTgxMmI3MmNkOWQ0OTViYmZlYWFiMDJjMmMyOTg5ZC5iaW5kUG9wdXAocG9wdXBfMTMwOTRkZTE4MjlhNDYzNTlmM2MwNWY4MzUxYWU0ZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTY2YjEwYTQzM2E5NDA3OGExYmRjOWU2NjE5MjBiZDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODAzMzUzNjUsLTQzLjkzMjM0ODc3NDg5Nzc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlMjQ5OTUwZDA4YTRiNmM5YzNiNWQ4M2FhNGZkY2YzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5MGE5YzE4NDZmYzQ2Yzg4MTNmYzVhMGJiMzZkZjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9jOTBhOWMxODQ2ZmM0NmM4ODEzZmM1YTBiYjM2ZGY0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SkFRVUVMSU5FIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGUyNDk5NTBkMDhhNGI2YzljM2I1ZDgzYWE0ZmRjZjMuc2V0Q29udGVudChodG1sX2M5MGE5YzE4NDZmYzQ2Yzg4MTNmYzVhMGJiMzZkZjQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2NmIxMGE0MzNhOTQwNzhhMWJkYzllNjYxOTIwYmQzLmJpbmRQb3B1cChwb3B1cF8wZTI0OTk1MGQwOGE0YjZjOWMzYjVkODNhYTRmZGNmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZDk0YmRiYjRkMjY0NWYxOTQwZjJhZjVhZDk0MmRkNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTc0NzIzNSwtNDMuOTg4ODM1NTEzODY0ODVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTZkODk3MjJmODdlNGZmMWJlMjdmOTYwMmE5MzA4ZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmVhZDFmMjhiMmZjNGVhMDlmNmI4MDdjMDMxZmYxZTIgPSAkKCc8ZGl2IGlkPSJodG1sXzZlYWQxZjI4YjJmYzRlYTA5ZjZiODA3YzAzMWZmMWUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KQVJESU0gQUxWT1JBREEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNmQ4OTcyMmY4N2U0ZmYxYmUyN2Y5NjAyYTkzMDhlZi5zZXRDb250ZW50KGh0bWxfNmVhZDFmMjhiMmZjNGVhMDlmNmI4MDdjMDMxZmYxZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQ5NGJkYmI0ZDI2NDVmMTk0MGYyYWY1YWQ5NDJkZDQuYmluZFBvcHVwKHBvcHVwXzE2ZDg5NzIyZjg3ZTRmZjFiZTI3Zjk2MDJhOTMwOGVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmNzY2ZjIyY2FiMTRjYTJiYTYzOWIyMzVhMDU5NGFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljc5MjM1OTQsLTQzLjk3MDA0OTUxMjAzODYzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWI1OWQ2MmI5MGE0ZTY0ODA5MTYzM2NjYTI2YzA0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGQzYmNhZWI0NjU0Yjg2YTQ4NTAxZDdjMjc3NWI0ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhkM2JjYWViNDY1NGI4NmE0ODUwMWQ3YzI3NzViNGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkpBUkRJTSBDT01FUkNJQVJJT1MgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWI1OWQ2MmI5MGE0ZTY0ODA5MTYzM2NjYTI2YzA0Ni5zZXRDb250ZW50KGh0bWxfMDhkM2JjYWViNDY1NGI4NmE0ODUwMWQ3YzI3NzViNGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Y3NjZmMjJjYWIxNGNhMmJhNjM5YjIzNWEwNTk0YWUuYmluZFBvcHVwKHBvcHVwXzgxYjU5ZDYyYjkwYTRlNjQ4MDkxNjMzY2NhMjZjMDQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3MjliM2QzNzcxYTQ4YTM4YzNkMjEzNTYwMzllYjAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgwMjIxMzAwMDAwMDAwMiwtNDMuOTY3MDY2NzAwMDAwMDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkYWZjNjgxZDlmYjRkOTRiN2M5NGEzOGQyNjAxNDBlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2YjQ3MGQ5NDhkYjQ0MjZiZGU2MTIyMTVhOTI3MzVkID0gJCgnPGRpdiBpZD0iaHRtbF85NmI0NzBkOTQ4ZGI0NDI2YmRlNjEyMjE1YTkyNzM1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SkFSRElNIEVVUk9QQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkYWZjNjgxZDlmYjRkOTRiN2M5NGEzOGQyNjAxNDBlLnNldENvbnRlbnQoaHRtbF85NmI0NzBkOTQ4ZGI0NDI2YmRlNjEyMjE1YTkyNzM1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNzI5YjNkMzc3MWE0OGEzOGMzZDIxMzU2MDM5ZWIwMS5iaW5kUG9wdXAocG9wdXBfN2RhZmM2ODFkOWZiNGQ5NGI3Yzk0YTM4ZDI2MDE0MGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2IzNjg1MmJjY2JjNDNmOWE4YjVlZTA1YTQ5NjA2NmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODI3MzEwNjk5OTk5OTk4LC00My45MjY5MjExMjI4MTMxNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjAwNmQ4MzJjMjk0N2IwOGQ2ZmU0YmZiODk2Zjc1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODUxY2Y1MjAyYTE0ODdkOWVhZDM2MGI3ODEwMDZiNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTg1MWNmNTIwMmExNDg3ZDllYWQzNjBiNzgxMDA2YjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkpBUkRJTSBGRUxJQ0lEQURFIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTIwMDZkODMyYzI5NDdiMDhkNmZlNGJmYjg5NmY3NTQuc2V0Q29udGVudChodG1sX2E4NTFjZjUyMDJhMTQ4N2Q5ZWFkMzYwYjc4MTAwNmI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNiMzY4NTJiY2NiYzQzZjlhOGI1ZWUwNWE0OTYwNjZmLmJpbmRQb3B1cChwb3B1cF9hMjAwNmQ4MzJjMjk0N2IwOGQ2ZmU0YmZiODk2Zjc1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTA2ZDFlNTdmZWU0MDQ4YWI4NDQ2ZTExZWY1ZDdhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MTA3OTA3LC00NC4wMDc2ODQ5OTk5OTk5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWY5ZjY4OTAxMGQ4NDZlNGE1ODc5MDkxYTRjZmQwN2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE3MGE1YTZhODA3NGU1ODk4OGMzMWZiZGIyNTlkZDMgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhNzBhNWE2YTgwNzRlNTg5ODhjMzFmYmRiMjU5ZGQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KQVJESU0gRklMQURFTEZJQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmOWY2ODkwMTBkODQ2ZTRhNTg3OTA5MWE0Y2ZkMDdkLnNldENvbnRlbnQoaHRtbF9mYTcwYTVhNmE4MDc0ZTU4OTg4YzMxZmJkYjI1OWRkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMTA2ZDFlNTdmZWU0MDQ4YWI4NDQ2ZTExZWY1ZDdhMC5iaW5kUG9wdXAocG9wdXBfOWY5ZjY4OTAxMGQ4NDZlNGE1ODc5MDkxYTRjZmQwN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGMxNGQ4ZjRjZjNlNGIxNmI5NDM5NjUwMzk4Y2VjZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODI3NjMxMiwtNDMuOTM1ODc0OTQzNzI5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjMwZjUzYTMzYzlmNDk3Y2I2MzUwNTQxODVmNjgxYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTY2ODZkZjM0MzA4NGU2Nzk0YzAyZmQ3NGIxMzg3YmQgPSAkKCc8ZGl2IGlkPSJodG1sXzU2Njg2ZGYzNDMwODRlNjc5NGMwMmZkNzRiMTM4N2JkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KQVJESU0gR1VBTkFCQVJBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjMwZjUzYTMzYzlmNDk3Y2I2MzUwNTQxODVmNjgxYjEuc2V0Q29udGVudChodG1sXzU2Njg2ZGYzNDMwODRlNjc5NGMwMmZkNzRiMTM4N2JkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjMTRkOGY0Y2YzZTRiMTZiOTQzOTY1MDM5OGNlY2UwLmJpbmRQb3B1cChwb3B1cF9mMzBmNTNhMzNjOWY0OTdjYjYzNTA1NDE4NWY2ODFiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZDcwZTdjOTQ5YjA0N2Y5OGMxM2M1MjNiZTMxYmFlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MDcyMjE5NSwtNDMuOTgxNjM3MjYwNzcxNjU2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmOTg2ZjQ1OTdmZTRkMzY4NWYwYWY1OTY3ZmU4ZDYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2MDRhZjJlMGUwZDRkMmQ5NWZlMWM3MjM4ZGRlZThiID0gJCgnPGRpdiBpZD0iaHRtbF82NjA0YWYyZTBlMGQ0ZDJkOTVmZTFjNzIzOGRkZWU4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SkFSRElNIE1PTlRBTkhFUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmOTg2ZjQ1OTdmZTRkMzY4NWYwYWY1OTY3ZmU4ZDYyLnNldENvbnRlbnQoaHRtbF82NjA0YWYyZTBlMGQ0ZDJkOTVmZTFjNzIzOGRkZWU4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZDcwZTdjOTQ5YjA0N2Y5OGMxM2M1MjNiZTMxYmFlYi5iaW5kUG9wdXAocG9wdXBfNGY5ODZmNDU5N2ZlNGQzNjg1ZjBhZjU5NjdmZThkNjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGU0NjQyYmJhZjQxNDY1NDgzMzY5OWNiNDQyNjZlY2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODUzMjEwMywtNDMuODcyMTY4NjU0NTkwMDM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1MGM2ZTM0NDU3ODQxYjk4NmU1ZjEwNDhhY2VkY2ViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1NTUxNWJmODI3YTQ3MDY5NDQ1ZTRkODk2NjBhYzJjID0gJCgnPGRpdiBpZD0iaHRtbF9lNTU1MTViZjgyN2E0NzA2OTQ0NWU0ZDg5NjYwYWMyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SkFSRElNIFZJVE9SSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTBjNmUzNDQ1Nzg0MWI5ODZlNWYxMDQ4YWNlZGNlYi5zZXRDb250ZW50KGh0bWxfZTU1NTE1YmY4MjdhNDcwNjk0NDVlNGQ4OTY2MGFjMmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGU0NjQyYmJhZjQxNDY1NDgzMzY5OWNiNDQyNjZlY2IuYmluZFBvcHVwKHBvcHVwX2E1MGM2ZTM0NDU3ODQxYjk4NmU1ZjEwNDhhY2VkY2ViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliZTc0OWE3MDJlOTQzNmNhOTg2YWE4N2VlYzdmODJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk0MTg4NDQsLTQ0LjAwMzA1NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWY4ZGVhMjc2NWMxNDQ5ZDhiYzZmYTkxZTg5MDNiZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWViMTU1M2I4OWRlNDc3ZGFkOWFmODRiMjkxMGI1MWEgPSAkKCc8ZGl2IGlkPSJodG1sXzVlYjE1NTNiODlkZTQ3N2RhZDlhZjg0YjI5MTBiNTFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KQVJESU5PUE9MSVMgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZjhkZWEyNzY1YzE0NDlkOGJjNmZhOTFlODkwM2JlNS5zZXRDb250ZW50KGh0bWxfNWViMTU1M2I4OWRlNDc3ZGFkOWFmODRiMjkxMGI1MWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWJlNzQ5YTcwMmU5NDM2Y2E5ODZhYTg3ZWVjN2Y4MmQuYmluZFBvcHVwKHBvcHVwXzlmOGRlYTI3NjVjMTQ0OWQ4YmM2ZmE5MWU4OTAzYmU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxMjNlMDE0NGM4YjRhOTQ5YThhOWM3NTExOTczYjNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk5MTQ5MjM1LC00NC4wNTQ1MDA3MTg2MDI2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NGI0ZTQxNTc2Njc0OGNjYmNmYTVhMDFmM2MyM2ZhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZWYyZDFiMDZmNGI0MDIwYWI1MGMzM2M2YjExNTNkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2VmMmQxYjA2ZjRiNDAyMGFiNTBjMzNjNmIxMTUzZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkpBVE9CQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0YjRlNDE1NzY2NzQ4Y2NiY2ZhNWEwMWYzYzIzZmE4LnNldENvbnRlbnQoaHRtbF83ZWYyZDFiMDZmNGI0MDIwYWI1MGMzM2M2YjExNTNkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MTIzZTAxNDRjOGI0YTk0OWE4YTljNzUxMTk3M2IzZi5iaW5kUG9wdXAocG9wdXBfNTRiNGU0MTU3NjY3NDhjY2JjZmE1YTAxZjNjMjNmYTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjJmMzNkMGQ1MDg3NGQ5Mzg4OWM1NjdmMWI3ZDBjNWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODE2MzI4NjAwMDAwMDAyLC00My45NDM2MDgyNjkwNDk3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZjY2ZTUyNmU4ZTM0MmU4YTgwMzQxOTkwZWRlN2MwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjQ2YjQwOTM4Yjg0YzJiYjQ2MDAzZDhlNWJmZTZiOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWI0NmI0MDkzOGI4NGMyYmI0NjAwM2Q4ZTViZmU2YjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkpVTElBTkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZjY2ZTUyNmU4ZTM0MmU4YTgwMzQxOTkwZWRlN2MwMi5zZXRDb250ZW50KGh0bWxfNWI0NmI0MDkzOGI4NGMyYmI0NjAwM2Q4ZTViZmU2YjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjJmMzNkMGQ1MDg3NGQ5Mzg4OWM1NjdmMWI3ZDBjNWQuYmluZFBvcHVwKHBvcHVwXzRmNjZlNTI2ZThlMzQyZThhODAzNDE5OTBlZGU3YzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3ZWE5YjE0MjJjYzQ2YWM5NmQ4Mjc1MDM1ODBiNjI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgxMDIwMzcsLTQ0LjAwMDQ0Mjg0NTU1NjIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2NDAzNjZhZGNlNDQ4YjRiYjcwZDVmYzJkMWU0ZDljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1N2EwMGQwNzNhYjQ0ZTM4NWQ0OWRkNzlkN2YzMjViID0gJCgnPGRpdiBpZD0iaHRtbF9hNTdhMDBkMDczYWI0NGUzODVkNDlkZDc5ZDdmMzI1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFHT0EgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNjQwMzY2YWRjZTQ0OGI0YmI3MGQ1ZmMyZDFlNGQ5Yy5zZXRDb250ZW50KGh0bWxfYTU3YTAwZDA3M2FiNDRlMzg1ZDQ5ZGQ3OWQ3ZjMyNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDdlYTliMTQyMmNjNDZhYzk2ZDgyNzUwMzU4MGI2MjYuYmluZFBvcHVwKHBvcHVwX2Q2NDAzNjZhZGNlNDQ4YjRiYjcwZDVmYzJkMWU0ZDljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwYzQyYjU0NWQ3YzQwOGU5MjUyNmM3MWFmNTc2ZWRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkyMjM5MTEwMDAwMDAwMiwtNDMuOTU4NjUzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMjJiNzZmNzZiMDE0NTUwOGYwNDc1ODQ2M2RjMDhhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Y2I3OWYwOTkzZTA0OTUxYWFiM2E5YjI4MTVjYzZjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGNiNzlmMDk5M2UwNDk1MWFhYjNhOWIyODE1Y2M2Y2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxFQkxPTiBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyMmI3NmY3NmIwMTQ1NTA4ZjA0NzU4NDYzZGMwOGFlLnNldENvbnRlbnQoaHRtbF84Y2I3OWYwOTkzZTA0OTUxYWFiM2E5YjI4MTVjYzZjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MGM0MmI1NDVkN2M0MDhlOTI1MjZjNzFhZjU3NmVkYS5iaW5kUG9wdXAocG9wdXBfMzIyYjc2Zjc2YjAxNDU1MDhmMDQ3NTg0NjNkYzA4YWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjY1MDIxODMwYmUxNDE3NDgyYTk2YjczMDViZDZiNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODA3Mzg3MywtNDMuOTc4MzM0Mzg1OTQzNTI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxZDU4NDE5YWE5MjQyNGZiZGQwY2ZlYWM0OGE3YTMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmNWYzNTU3MTJjOTRiYWFhNDJiNWUzN2ZkYmE4YTY4ID0gJCgnPGRpdiBpZD0iaHRtbF9iZjVmMzU1NzEyYzk0YmFhYTQyYjVlMzdmZGJhOGE2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEVUSUNJQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxZDU4NDE5YWE5MjQyNGZiZGQwY2ZlYWM0OGE3YTMyLnNldENvbnRlbnQoaHRtbF9iZjVmMzU1NzEyYzk0YmFhYTQyYjVlMzdmZGJhOGE2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNjUwMjE4MzBiZTE0MTc0ODJhOTZiNzMwNWJkNmI0MS5iaW5kUG9wdXAocG9wdXBfMzFkNTg0MTlhYTkyNDI0ZmJkZDBjZmVhYzQ4YTdhMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQ0YjBlNWVhNGQyNDA2MDk5MjJhYjM1MTExNGYxZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTc3NDEzNywtNDQuMDUwNjM1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NTU1Yzg2MWZmMWU0N2ZiOGY4YTc2NjQ2NzFkYjExZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMDVjZmZiN2Y3YTE0NmI4YjZmODUwNWM1NDg0ZTQzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTA1Y2ZmYjdmN2ExNDZiOGI2Zjg1MDVjNTQ4NGU0MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxJTkRFSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTU1Yzg2MWZmMWU0N2ZiOGY4YTc2NjQ2NzFkYjExZi5zZXRDb250ZW50KGh0bWxfYTA1Y2ZmYjdmN2ExNDZiOGI2Zjg1MDVjNTQ4NGU0MzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjQ0YjBlNWVhNGQyNDA2MDk5MjJhYjM1MTExNGYxZmMuYmluZFBvcHVwKHBvcHVwXzY1NTVjODYxZmYxZTQ3ZmI4ZjhhNzY2NDY3MWRiMTFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3YTJiN2E5MWEzOTQ3NGQ4NjI0Yzg0Y2Q0YjJlNTViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk1MDMyNjEsLTQ0LjAwNjgyMTIwMDAwMDAwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzlmZGI2YjI4YTA0MmU3YmMzNDk3ODJjNjkyOGJhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xM2JhOWFlN2U2ZTk0NDI1OTczZGIzNzEyMmQ3NmM1YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTNiYTlhZTdlNmU5NDQyNTk3M2RiMzcxMjJkNzZjNWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1BRFJFIEdFUlRSVURFUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzOWZkYjZiMjhhMDQyZTdiYzM0OTc4MmM2OTI4YmE0LnNldENvbnRlbnQoaHRtbF8xM2JhOWFlN2U2ZTk0NDI1OTczZGIzNzEyMmQ3NmM1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jN2EyYjdhOTFhMzk0NzRkODYyNGM4NGNkNGIyZTU1Yi5iaW5kUG9wdXAocG9wdXBfMzM5ZmRiNmIyOGEwNDJlN2JjMzQ5NzgyYzY5MjhiYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDU3MDYyMDNlMzE1NGE2ZThhNDI1YjMyNThhMjBlOTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQ5NDg1NywtNDQuMDk3MjU2MjAwMDAwMDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxMTAyMTJhNTg1ODQ0MjY4MjYwZTllMWZmYjA5ZDQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I5ODMxMTUyZGU3ODRkYjE5Zjk0NDk3ZThlNzhiOGFhID0gJCgnPGRpdiBpZD0iaHRtbF9iOTgzMTE1MmRlNzg0ZGIxOWY5NDQ5N2U4ZTc4YjhhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUFHTkVTSVRBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjExMDIxMmE1ODU4NDQyNjgyNjBlOWUxZmZiMDlkNDUuc2V0Q29udGVudChodG1sX2I5ODMxMTUyZGU3ODRkYjE5Zjk0NDk3ZThlNzhiOGFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1NzA2MjAzZTMxNTRhNmU4YTQyNWIzMjU4YTIwZTk3LmJpbmRQb3B1cChwb3B1cF9iMTEwMjEyYTU4NTg0NDI2ODI2MGU5ZTFmZmIwOWQ0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NTQ0ODkwZWJkY2Y0ZTlhODU2NDRhNzA0MTEyNDNjZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS43OTI4NzA1NSwtNDMuOTgzMzMxNTYxNjgxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjYjRiNTQxNTMwZjQ1NGZhNWUzMjI2OWNkNzg5ZTUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlNTRlMDIzOWMxOTQ0ZGRiOGVlYjU3ZmJiOWQxODc3ID0gJCgnPGRpdiBpZD0iaHRtbF9iZTU0ZTAyMzljMTk0NGRkYjhlZWI1N2ZiYjlkMTg3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUFOVElRVUVJUkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84Y2I0YjU0MTUzMGY0NTRmYTVlMzIyNjljZDc4OWU1My5zZXRDb250ZW50KGh0bWxfYmU1NGUwMjM5YzE5NDRkZGI4ZWViNTdmYmI5ZDE4NzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODU0NDg5MGViZGNmNGU5YTg1NjQ0YTcwNDExMjQzY2YuYmluZFBvcHVwKHBvcHVwXzhjYjRiNTQxNTMwZjQ1NGZhNWUzMjI2OWNkNzg5ZTUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkYTAzOGM4MWUwNTQ3ZGVhOGMwY2M0NGFiZDE0YTMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk1ODkwNTcsLTQzLjk4MTAyMjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDdkYjg0ZWUzZTc5NDk4ZGJhMjQyM2MwYmVlYzcwOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjFmNDFmZTNjNjgxNDAwODk1MzE5ZGZhZjBhYzUzZDQgPSAkKCc8ZGl2IGlkPSJodG1sX2IxZjQxZmUzYzY4MTQwMDg5NTMxOWRmYWYwYWM1M2Q0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NQVJBSk8gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80N2RiODRlZTNlNzk0OThkYmEyNDIzYzBiZWVjNzA5YS5zZXRDb250ZW50KGh0bWxfYjFmNDFmZTNjNjgxNDAwODk1MzE5ZGZhZjBhYzUzZDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGRhMDM4YzgxZTA1NDdkZWE4YzBjYzQ0YWJkMTRhMzEuYmluZFBvcHVwKHBvcHVwXzQ3ZGI4NGVlM2U3OTQ5OGRiYTI0MjNjMGJlZWM3MDlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhNzRjN2VkZDMzYzRjZmQ5NDNjYWNjZjk1ZGE0MmNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljc5ODg1ODA1LC00My45OTQ4NTU4OTkxODAyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjYyOWZkZWQxZWY0ZWU0YjNmYWM4NTkyOWJkM2I3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOGRjNmU4MTcyNWQ0NGMwYjVmNGMwOTJjNDA0N2UxNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzhkYzZlODE3MjVkNDRjMGI1ZjRjMDkyYzQwNDdlMTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1BUklBIEhFTEVOQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmNjI5ZmRlZDFlZjRlZTRiM2ZhYzg1OTI5YmQzYjdkLnNldENvbnRlbnQoaHRtbF9jOGRjNmU4MTcyNWQ0NGMwYjVmNGMwOTJjNDA0N2UxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YTc0YzdlZGQzM2M0Y2ZkOTQzY2FjY2Y5NWRhNDJjYy5iaW5kUG9wdXAocG9wdXBfM2Y2MjlmZGVkMWVmNGVlNGIzZmFjODU5MjliZDNiN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDczZjI5ZDJjOGExNDY3ODk1ZDcyYzYwZGRkMTM2OTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODY4NzMxMDUsLTQzLjkzMzc1ODU0NTg4NjI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmMjNlMGQ2M2EwYjQ3ZmE5YjQ2MDVjZDk1ZmRkOGI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkYjc3MzdlZmMwNDQzMmQ5MjliMWQ4M2NjZjMzNWMzID0gJCgnPGRpdiBpZD0iaHRtbF9iZGI3NzM3ZWZjMDQ0MzJkOTI5YjFkODNjY2YzMzVjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUFSSUEgVklSR0lOSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjIzZTBkNjNhMGI0N2ZhOWI0NjA1Y2Q5NWZkZDhiNi5zZXRDb250ZW50KGh0bWxfYmRiNzczN2VmYzA0NDMyZDkyOWIxZDgzY2NmMzM1YzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDczZjI5ZDJjOGExNDY3ODk1ZDcyYzYwZGRkMTM2OTQuYmluZFBvcHVwKHBvcHVwXzBmMjNlMGQ2M2EwYjQ3ZmE5YjQ2MDVjZDk1ZmRkOGI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0OTRkZGQ5ZDk0NTRkNDRhZTI3Njc1NGIzMGFhYjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgyMTYyMDQsLTQzLjk0MTIzNzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTI1NTllZGM1NTNlNGZlZWE3ZDExNjViNmFlNDIxYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmM4ODA3Zjg4Mzk0NGFmMWFlY2JjOTA2OGEyMjdkMTAgPSAkKCc8ZGl2IGlkPSJodG1sX2JjODgwN2Y4ODM5NDRhZjFhZWNiYzkwNjhhMjI3ZDEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NQVJJWkUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjU1OWVkYzU1M2U0ZmVlYTdkMTE2NWI2YWU0MjFhMy5zZXRDb250ZW50KGh0bWxfYmM4ODA3Zjg4Mzk0NGFmMWFlY2JjOTA2OGEyMjdkMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjQ5NGRkZDlkOTQ1NGQ0NGFlMjc2NzU0YjMwYWFiMDAuYmluZFBvcHVwKHBvcHVwXzEyNTU5ZWRjNTUzZTRmZWVhN2QxMTY1YjZhZTQyMWEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhMWI4ZjdjNTY2NjRhMTNiNzYxYTc5ZTIyOTMzMmIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk4MDUwNTYsLTQ0LjAwMTgzMDcwMDAwMDAwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNWYxMTI0OTZmYmQ0ODFlODNkNjM5OGJlZmMxYzViYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYzkzOGZiN2I4Njk0OThlOTEyMjAzYjg2OWE2Y2QyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGM5MzhmYjdiODY5NDk4ZTkxMjIwM2I4NjlhNmNkMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JTElPTkFSSU9TIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVmMTEyNDk2ZmJkNDgxZTgzZDYzOThiZWZjMWM1YmEuc2V0Q29udGVudChodG1sX2RjOTM4ZmI3Yjg2OTQ5OGU5MTIyMDNiODY5YTZjZDJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhMWI4ZjdjNTY2NjRhMTNiNzYxYTc5ZTIyOTMzMmIzLmJpbmRQb3B1cChwb3B1cF9jNWYxMTI0OTZmYmQ0ODFlODNkNjM5OGJlZmMxYzViYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MmNlZDUxN2NhY2E0YWM0YTQ0NjVkMmI0NWZiNTI2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MDg5MzMxLC00My45NTQ3NTAyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81N2Q4ZmJhMzNkZjQ0NTJlYmFhMDBjYmViNzE4MWUwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNDE3ODM5YjM0Nzc0OWM2YmU3YzhkMzIwMTU0OTRiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTQxNzgzOWIzNDc3NDljNmJlN2M4ZDMyMDE1NDk0YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JTkFTIENBSVhBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTdkOGZiYTMzZGY0NDUyZWJhYTAwY2JlYjcxODFlMDMuc2V0Q29udGVudChodG1sX2E0MTc4MzliMzQ3NzQ5YzZiZTdjOGQzMjAxNTQ5NGIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyY2VkNTE3Y2FjYTRhYzRhNDQ2NWQyYjQ1ZmI1MjZkLmJpbmRQb3B1cChwb3B1cF81N2Q4ZmJhMzNkZjQ0NTJlYmFhMDBjYmViNzE4MWUwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZWU5ZGEwY2QxYmY0YTBhYmVjMmVjOTBjZGIxMDIwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NTIxMDMyNSwtNDMuOTMwNzkwOTYzODkzMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGE4M2YzZjcwYzNiNDVhN2IyZTEzNjhlYjE0ZTY5ZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDdjMDVlYTk5YzYzNDk4OGJmN2I0MDVmZTJiOTNkNjQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3YzA1ZWE5OWM2MzQ5ODhiZjdiNDA1ZmUyYjkzZDY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSU5BU0xBTkRJQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhODNmM2Y3MGMzYjQ1YTdiMmUxMzY4ZWIxNGU2OWYwLnNldENvbnRlbnQoaHRtbF9kN2MwNWVhOTljNjM0OTg4YmY3YjQwNWZlMmI5M2Q2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZWU5ZGEwY2QxYmY0YTBhYmVjMmVjOTBjZGIxMDIwZi5iaW5kUG9wdXAocG9wdXBfNGE4M2YzZjcwYzNiNDVhN2IyZTEzNjhlYjE0ZTY5ZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTMwMGZjZTYwMTZmNDM1OTkyY2Y0MGU3OGIwN2ZkYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODUxNTUwMSwtNDMuODk2MjkyOTQ4NDY5NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTg2YzJmMWU4ZThmNDg2MWJiYzA0MDg1YjhkZDljNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODEwZDhhMTU5ZWIyNDNlN2E0OTM1MDJjMGQ3NTgwOTggPSAkKCc8ZGl2IGlkPSJodG1sXzgxMGQ4YTE1OWViMjQzZTdhNDkzNTAyYzBkNzU4MDk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OQVpBUkUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODZjMmYxZThlOGY0ODYxYmJjMDQwODViOGRkOWM1OS5zZXRDb250ZW50KGh0bWxfODEwZDhhMTU5ZWIyNDNlN2E0OTM1MDJjMGQ3NTgwOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTMwMGZjZTYwMTZmNDM1OTkyY2Y0MGU3OGIwN2ZkYTguYmluZFBvcHVwKHBvcHVwX2U4NmMyZjFlOGU4ZjQ4NjFiYmMwNDA4NWI4ZGQ5YzU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhNTMxNzg4MGUzMDRhMTg5Nzk5NGE2MGUzZmM0YWZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljc5NjUzMTEwMDAwMDAwMywtNDMuOTg4ODA1Mjk5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwODk5MzA0NTFjMDRmOGU5YWIxMGVhODdlOTY2NTAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZjVmYjVjY2RmZDRkMjE5NTU4NGEyMzg2OGI0MWU4ID0gJCgnPGRpdiBpZD0iaHRtbF82MWY1ZmI1Y2NkZmQ0ZDIxOTU1ODRhMjM4NjhiNDFlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9WQSBBTUVSSUNBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzA4OTkzMDQ1MWMwNGY4ZTlhYjEwZWE4N2U5NjY1MDMuc2V0Q29udGVudChodG1sXzYxZjVmYjVjY2RmZDRkMjE5NTU4NGEyMzg2OGI0MWU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhNTMxNzg4MGUzMDRhMTg5Nzk5NGE2MGUzZmM0YWZlLmJpbmRQb3B1cChwb3B1cF9jMDg5OTMwNDUxYzA0ZjhlOWFiMTBlYTg3ZTk2NjUwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NmY3NzVjNDIxZmM0ZmUwYjM1ODAxOGVlZmIzYWFjMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44ODQwMTQzLC00My45NTYzMzk2OTE3NzIwOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YmU3MmIyMDE1OTQ0MjM1OTE2NGI4OWU2YjgwYWM0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMDZiNjAzZjQwOWU0ZGJkYmM3MDI5OWI5ZTE2ZDA2MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTA2YjYwM2Y0MDllNGRiZGJjNzAyOTliOWUxNmQwNjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PVkEgQ0FDSE9FSVJJTkhBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGJlNzJiMjAxNTk0NDIzNTkxNjRiODllNmI4MGFjNDIuc2V0Q29udGVudChodG1sX2UwNmI2MDNmNDA5ZTRkYmRiYzcwMjk5YjllMTZkMDYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2Zjc3NWM0MjFmYzRmZTBiMzU4MDE4ZWVmYjNhYWMzLmJpbmRQb3B1cChwb3B1cF84YmU3MmIyMDE1OTQ0MjM1OTE2NGI4OWU2YjgwYWM0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzY1OTA0OWE2N2U0ZjRhYjAwYWI2YjVmMDNmYTc4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDk3NzkyNSwtNDMuOTkxNjg0NDY4NjIzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMjUwZTQ4MjgzZDU0MzE5ODQxNGJjNWM1MDdhOTBlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NTFiMzliNmQ2NmY0YjIyOGE1N2E0MTQzZTY4ZGQ1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTUxYjM5YjZkNjZmNGIyMjhhNTdhNDE0M2U2OGRkNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PVkEgQ0lOVFJBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzI1MGU0ODI4M2Q1NDMxOTg0MTRiYzVjNTA3YTkwZWEuc2V0Q29udGVudChodG1sXzU1MWIzOWI2ZDY2ZjRiMjI4YTU3YTQxNDNlNjhkZDViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzNjU5MDQ5YTY3ZTRmNGFiMDBhYjZiNWYwM2ZhNzg0LmJpbmRQb3B1cChwb3B1cF8zMjUwZTQ4MjgzZDU0MzE5ODQxNGJjNWM1MDdhOTBlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZmY5YmIzYWJjZjI0MGNhOGQwNTQ2YWU0NTQzNDhlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTk0MDUyLC00My45NTkzODMxNjc1MjAzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YmQ4N2M3MDRlMTM0MzNlODk0ZjUzNmE4NGI1MjM1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYWY0NGNkZGI4ZTQ0MTkxYjdiYWVhMmFkY2U0NmU2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWFmNDRjZGRiOGU0NDE5MWI3YmFlYTJhZGNlNDZlNmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PVkEgRVNQRVJBTkNBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmJkODdjNzA0ZTEzNDMzZTg5NGY1MzZhODRiNTIzNTcuc2V0Q29udGVudChodG1sX2FhZjQ0Y2RkYjhlNDQxOTFiN2JhZWEyYWRjZTQ2ZTZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdmZjliYjNhYmNmMjQwY2E4ZDA1NDZhZTQ1NDM0OGVhLmJpbmRQb3B1cChwb3B1cF82YmQ4N2M3MDRlMTM0MzNlODk0ZjUzNmE4NGI1MjM1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYTc3ZDNiZTkyMWQ0ZDcyOWI2NDUzNDA0ZWI5YjE1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDE3OTcxOTk5OTk5OTYsLTQzLjk5MjY4NjcyMjQ1MDUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlOGI2NzQ1ZDZmNDRlYWFhZWY1NDM5ZWZmMzY2YmNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QyYzQ0ZGM1NDNjODQ0YTVhNDVmNDIxMmQ0N2ViYWE2ID0gJCgnPGRpdiBpZD0iaHRtbF9kMmM0NGRjNTQzYzg0NGE1YTQ1ZjQyMTJkNDdlYmFhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9WQSBHQU1FTEVJUkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZThiNjc0NWQ2ZjQ0ZWFhYWVmNTQzOWVmZjM2NmJjYy5zZXRDb250ZW50KGh0bWxfZDJjNDRkYzU0M2M4NDRhNWE0NWY0MjEyZDQ3ZWJhYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmE3N2QzYmU5MjFkNGQ3MjliNjQ1MzQwNGViOWIxNWEuYmluZFBvcHVwKHBvcHVwXzZlOGI2NzQ1ZDZmNDRlYWFhZWY1NDM5ZWZmMzY2YmNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiOWEzOTU2YmY2MTQzZTY5NmQzYzg3YjRiZWIxZmFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgzMTkzOTAwMDAwMDAwMiwtNDQuMDE3NjkyMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ1Y2IyZGNiZTJkNDhmMTgzNjRiNGVjYjIyOThmMGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmRiNDU0YjcxOWQ2NGRkZWI3YjA5OGQ0YjJhNjBhNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzJkYjQ1NGI3MTlkNjRkZGViN2IwOThkNGIyYTYwYTU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT1ZBIFBBTVBVTEhBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQ1Y2IyZGNiZTJkNDhmMTgzNjRiNGVjYjIyOThmMGQuc2V0Q29udGVudChodG1sXzJkYjQ1NGI3MTlkNjRkZGViN2IwOThkNGIyYTYwYTU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiOWEzOTU2YmY2MTQzZTY5NmQzYzg3YjRiZWIxZmFiLmJpbmRQb3B1cChwb3B1cF9mZDVjYjJkY2JlMmQ0OGYxODM2NGI0ZWNiMjI5OGYwZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWEwOTg2YzY5OWM0MTZhYTVmOTA5OTI4ZThhYjBhZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44ODgwNjc1NSwtNDMuODk4MDMwMjUxMTkyMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTEyY2JkZGQ2YTE3NGQ3OTk4YTQ1NWZmMjUxOWEyMDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzU5NTI5Yjc4NmFkNGUyY2IwYTA1OGM1NWI0MTIyNzcgPSAkKCc8ZGl2IGlkPSJodG1sXzc1OTUyOWI3ODZhZDRlMmNiMGEwNThjNTViNDEyMjc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT1ZBIFZJU1RBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTEyY2JkZGQ2YTE3NGQ3OTk4YTQ1NWZmMjUxOWEyMDEuc2V0Q29udGVudChodG1sXzc1OTUyOWI3ODZhZDRlMmNiMGEwNThjNTViNDEyMjc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1YTA5ODZjNjk5YzQxNmFhNWY5MDk5MjhlOGFiMGFkLmJpbmRQb3B1cChwb3B1cF81MTJjYmRkZDZhMTc0ZDc5OThhNDU1ZmYyNTE5YTIwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZTdjNGU0ZjRmODQ0ZDI5YmYzODE4MWUzNWZiYTI2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45OTA3NzQsLTQ0LjAyNzk0NTI2NDgyNjU2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0YjYyMzIyN2RlNzQ5YTRhZWYyNzBiMDE0OTdhMDVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4MDIzZGE2YmEzMjQxMjY5YTY0ZGRjYjNmYWUyYWE0ID0gJCgnPGRpdiBpZD0iaHRtbF85ODAyM2RhNmJhMzI0MTI2OWE2NGRkY2IzZmFlMmFhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T0xBUklBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDRiNjIzMjI3ZGU3NDlhNGFlZjI3MGIwMTQ5N2EwNWYuc2V0Q29udGVudChodG1sXzk4MDIzZGE2YmEzMjQxMjY5YTY0ZGRjYjNmYWUyYWE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlN2M0ZTRmNGY4NDRkMjliZjM4MTgxZTM1ZmJhMjZlLmJpbmRQb3B1cChwb3B1cF9kNGI2MjMyMjdkZTc0OWE0YWVmMjcwYjAxNDk3YTA1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTU5NDRhNDljZDc0NjQxODA0NTM2NzNmNGE3ZTEyMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45OTAwNDU4LC00My45NjMxMjQ5MDAwMDAwMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjVkYTRmNDQ4OGIzNGFjZTgwNzc4Mzc5MTRjMTZjZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM0MDdhYzBjNmJmNDgxNGIzNGE5MmEwNGQxN2NkZjEgPSAkKCc8ZGl2IGlkPSJodG1sXzUzNDA3YWMwYzZiZjQ4MTRiMzRhOTJhMDRkMTdjZGYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PTEhPUyBEJiMzOTtBR1VBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjVkYTRmNDQ4OGIzNGFjZTgwNzc4Mzc5MTRjMTZjZWEuc2V0Q29udGVudChodG1sXzUzNDA3YWMwYzZiZjQ4MTRiMzRhOTJhMDRkMTdjZGYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlNTk0NGE0OWNkNzQ2NDE4MDQ1MzY3M2Y0YTdlMTIwLmJpbmRQb3B1cChwb3B1cF8yNWRhNGY0NDg4YjM0YWNlODA3NzgzNzkxNGMxNmNlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYWNlZmM5MTQ2MWM0ZjEzOTk2MGYyOTEwYjZlYmFhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NzU1MDMyMDAwMDAwMDIsLTQzLjk4MzczNTcxOTg0OTA0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OWYxZGJkZDJhNWY0YjAyODY3NTBlNGY5NTEyODFiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNmJiNDdiMzU4MGE0NjIxOTI0OTNmZGEyN2IwODM0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTZiYjQ3YjM1ODBhNDYyMTkyNDkzZmRhMjdiMDgzNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBBTE1FSVJBUyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5ZjFkYmRkMmE1ZjRiMDI4Njc1MGU0Zjk1MTI4MWJkLnNldENvbnRlbnQoaHRtbF9hNmJiNDdiMzU4MGE0NjIxOTI0OTNmZGEyN2IwODM0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYWNlZmM5MTQ2MWM0ZjEzOTk2MGYyOTEwYjZlYmFhZi5iaW5kUG9wdXAocG9wdXBfODlmMWRiZGQyYTVmNGIwMjg2NzUwZTRmOTUxMjgxYmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTc4ZDgwNTAzOWNkNGY1ZmIwODU2NjUwMGNhYmViMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTIyNDUzMzUsLTQzLjkwNDg2NzQ5NjYwODE1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTIyNGZhNjkxMTA0OGFiYWU4NmFjYjY0OTUzOGUxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NDYzMDcyZjdiMTM0MzlkODFhNDFiZTlmZDUyN2JhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzQ2MzA3MmY3YjEzNDM5ZDgxYTQxYmU5ZmQ1MjdiYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBBUkFJU08gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTIyNGZhNjkxMTA0OGFiYWU4NmFjYjY0OTUzOGUxYi5zZXRDb250ZW50KGh0bWxfNzQ2MzA3MmY3YjEzNDM5ZDgxYTQxYmU5ZmQ1MjdiYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTc4ZDgwNTAzOWNkNGY1ZmIwODU2NjUwMGNhYmViMDAuYmluZFBvcHVwKHBvcHVwX2FhMjI0ZmE2OTExMDQ4YWJhZTg2YWNiNjQ5NTM4ZTFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1ZWQ3OTM5MjNjYzRhYjdhMzNjY2MyMWFjN2YxOGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5MDgwMzcsLTQzLjk1MjYwODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTZkZjNmMGFmMDlhNDQ3ZWE0YWY0NTgwNDQwOTg0MTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWI0MGM5ZDNmMzlkNDM2NTg3YmRiMGNmNjUwMWUwMWQgPSAkKCc8ZGl2IGlkPSJodG1sX2ViNDBjOWQzZjM5ZDQzNjU4N2JkYjBjZjY1MDFlMDFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QQVJRVUUgUklBQ0hVRUxPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTZkZjNmMGFmMDlhNDQ3ZWE0YWY0NTgwNDQwOTg0MTIuc2V0Q29udGVudChodG1sX2ViNDBjOWQzZjM5ZDQzNjU4N2JkYjBjZjY1MDFlMDFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1ZWQ3OTM5MjNjYzRhYjdhMzNjY2MyMWFjN2YxOGIzLmJpbmRQb3B1cChwb3B1cF9lNmRmM2YwYWYwOWE0NDdlYTRhZjQ1ODA0NDA5ODQxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MDcyZTcxNzM5YTY0Y2MxOWE2OGZjY2IxMDZjYzQyMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDUzNTQwMDAwMDAwMDIsLTQzLjk5NDk1NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDYzNDIxZGEyZWU1NDBmNGFlMjBjNWUzYmNhMDE5NTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzAzMmJmNjBlYzQxNDJhNThlNWYwNTc5NzczNTZjY2EgPSAkKCc8ZGl2IGlkPSJodG1sXzcwMzJiZjYwZWM0MTQyYTU4ZTVmMDU3OTc3MzU2Y2NhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QQVRST0NJTklPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDYzNDIxZGEyZWU1NDBmNGFlMjBjNWUzYmNhMDE5NTkuc2V0Q29udGVudChodG1sXzcwMzJiZjYwZWM0MTQyYTU4ZTVmMDU3OTc3MzU2Y2NhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwNzJlNzE3MzlhNjRjYzE5YTY4ZmNjYjEwNmNjNDIxLmJpbmRQb3B1cChwb3B1cF80NjM0MjFkYTJlZTU0MGY0YWUyMGM1ZTNiY2EwMTk1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOWY3NDRkOGNmMjY0YWExOTVmNjAyMjg3MTAxMWI5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NDA2OTc1LC00My44OTExMDg1NjA1NTU1NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWM0Y2IxMWJlMTlkNGE3MjkwNjcyZGRjOTJlZmE4MjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmE4ZmMxYjFmYTZmNGU5YWJjZmE2ZmM2NTEwZTdiOTAgPSAkKCc8ZGl2IGlkPSJodG1sX2JhOGZjMWIxZmE2ZjRlOWFiY2ZhNmZjNjUxMGU3YjkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QQVVMTyBWSSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljNGNiMTFiZTE5ZDRhNzI5MDY3MmRkYzkyZWZhODI1LnNldENvbnRlbnQoaHRtbF9iYThmYzFiMWZhNmY0ZTlhYmNmYTZmYzY1MTBlN2I5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOWY3NDRkOGNmMjY0YWExOTVmNjAyMjg3MTAxMWI5MS5iaW5kUG9wdXAocG9wdXBfOWM0Y2IxMWJlMTlkNGE3MjkwNjcyZGRjOTJlZmE4MjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzE1MGQyNjM5MzFmNDgyOGFmYTAwMjczMWEwYTMyZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTAyMTI2ODk5OTk5OTk1LC00My45NDk3OTc4NTQ0NzY0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjEyOWJmOTMxNmI0ODFjYjRlZjQyMWNlNGM1ZGFiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTExZmIyODdiNTE0MjA1YjAyMWZmNzA4MDI2OWY4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDUxMWZiMjg3YjUxNDIwNWIwMjFmZjcwODAyNjlmOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBFRFJFSVJBIFBSQURPIExPUEVTIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjYxMjliZjkzMTZiNDgxY2I0ZWY0MjFjZTRjNWRhYjUuc2V0Q29udGVudChodG1sX2Q1MTFmYjI4N2I1MTQyMDViMDIxZmY3MDgwMjY5ZjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxNTBkMjYzOTMxZjQ4MjhhZmEwMDI3MzFhMGEzMmRmLmJpbmRQb3B1cChwb3B1cF82NjEyOWJmOTMxNmI0ODFjYjRlZjQyMWNlNGM1ZGFiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OTA5MGNlZjMzYzQ0OGY3YmFlNzkxMzA1MGQwMjQ5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MjI3MzE4LC00My45NDUwOTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmZDExMTMxMjhiMzQ2YzI4NzVlODVlN2IwMWZhNjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1OTIzZDcxNmQ3ZDQ2ZjY5M2JmMDlhZTc1YTViNTczID0gJCgnPGRpdiBpZD0iaHRtbF9kNTkyM2Q3MTZkN2Q0NmY2OTNiZjA5YWU3NWE1YjU3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UElORE9SQU1BIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWZkMTExMzEyOGIzNDZjMjg3NWU4NWU3YjAxZmE2NGUuc2V0Q29udGVudChodG1sX2Q1OTIzZDcxNmQ3ZDQ2ZjY5M2JmMDlhZTc1YTViNTczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5MDkwY2VmMzNjNDQ4ZjdiYWU3OTEzMDUwZDAyNDkzLmJpbmRQb3B1cChwb3B1cF85ZmQxMTEzMTI4YjM0NmMyODc1ZTg1ZTdiMDFmYTY0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGQ3YjFmODgxYzQ0NDEzYWE2YjZkMzJkYTllZGUyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NjYwNDA3NSwtNDMuOTE3NjEzNzczMjM1ODE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyZDE2ZGNlNmE2MDQzNDg5ODY5MDRiMWMyNzY0MjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzYjQ3ODcwOTFjNDQxMmNhMGIzMTg3ZThkMDNhNzI0ID0gJCgnPGRpdiBpZD0iaHRtbF9kM2I0Nzg3MDkxYzQ0MTJjYTBiMzE4N2U4ZDAzYTcyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UElSQUpBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODJkMTZkY2U2YTYwNDM0ODk4NjkwNGIxYzI3NjQyNGUuc2V0Q29udGVudChodG1sX2QzYjQ3ODcwOTFjNDQxMmNhMGIzMTg3ZThkMDNhNzI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY4ZDdiMWY4ODFjNDQ0MTNhYTZiNmQzMmRhOWVkZTI4LmJpbmRQb3B1cChwb3B1cF84MmQxNmRjZTZhNjA0MzQ4OTg2OTA0YjFjMjc2NDI0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMWQ2YzMwNTMxMDk0OTM4OTMzZjUxNDZmNmQ0Y2FlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MTE4NTE3LC00My45ODk4MzMxODA3NDM2OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzEyMjlhNDdmZDliNDViYjgzZDQzMDlkNmJhMDg5YzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDk5OWY3ODFhOTNmNDQ1NWIzNzJlOTg5ZjdiMGVmN2YgPSAkKCc8ZGl2IGlkPSJodG1sXzQ5OTlmNzgxYTkzZjQ0NTViMzcyZTk4OWY3YjBlZjdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QSVJBVElOSU5HQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxMjI5YTQ3ZmQ5YjQ1YmI4M2Q0MzA5ZDZiYTA4OWM2LnNldENvbnRlbnQoaHRtbF80OTk5Zjc4MWE5M2Y0NDU1YjM3MmU5ODlmN2IwZWY3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMWQ2YzMwNTMxMDk0OTM4OTMzZjUxNDZmNmQ0Y2FlOC5iaW5kUG9wdXAocG9wdXBfMzEyMjlhNDdmZDliNDViYjgzZDQzMDlkNmJhMDg5YzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWMyN2M2ZGJlMzMyNDExYmI2NDRhOGViMDgxMjQzODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAuMDA4MTAzOTUsLTQ0LjAwNzA4MTAyNDM5MzIxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNGU0NTVkNzQ5ZGE0MTMwYjZkYWI0NjBkYTJjY2I3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzUyYTc5MzJhMTU0NWFhOTZhNjYxNDY1Yzc3MzVlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzc1MmE3OTMyYTE1NDVhYTk2YTY2MTQ2NWM3NzM1ZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBPTkdFTFVQRSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0ZTQ1NWQ3NDlkYTQxMzBiNmRhYjQ2MGRhMmNjYjdkLnNldENvbnRlbnQoaHRtbF9jNzUyYTc5MzJhMTU0NWFhOTZhNjYxNDY1Yzc3MzVlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzI3YzZkYmUzMzI0MTFiYjY0NGE4ZWIwODEyNDM4Mi5iaW5kUG9wdXAocG9wdXBfZjRlNDU1ZDc0OWRhNDEzMGI2ZGFiNDYwZGEyY2NiN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzkwMzQyMzM1OGFmNDM4Yjg1N2E4MTRmM2E2Zjc5NmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAuMTk3NzAwNjUsLTQ0LjQyMjQ4MzYxNjEyNjE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhNjU2MmQ4YjBmNDRhMGY5MWY1NDhjYjJiYjVkMThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxM2ZjNjlmMTg3MjRkNjQ4ZDYxYTczODFjNzI0NzIyID0gJCgnPGRpdiBpZD0iaHRtbF84MTNmYzY5ZjE4NzI0ZDY0OGQ2MWE3MzgxYzcyNDcyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UFJBQ0EgWElJIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmE2NTYyZDhiMGY0NGEwZjkxZjU0OGNiMmJiNWQxOGYuc2V0Q29udGVudChodG1sXzgxM2ZjNjlmMTg3MjRkNjQ4ZDYxYTczODFjNzI0NzIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5MDM0MjMzNThhZjQzOGI4NTdhODE0ZjNhNmY3OTZmLmJpbmRQb3B1cChwb3B1cF82YTY1NjJkOGIwZjQ0YTBmOTFmNTQ4Y2IyYmI1ZDE4Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZDY4NGYyZDYxZDk0MWI3OTlhZTBmYmQyYWRhMTQxOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTkzMTA2OTk5OTk5OTcsLTQ0LjAwNjY5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMDdkOWY3YTA5ZjM0MjMwOTAwZTc3YTRhN2NmNTZiMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNzUxMjliYWRkZWU0MjlkYTU0YmEzMjQ4NzEwOWM5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDc1MTI5YmFkZGVlNDI5ZGE1NGJhMzI0ODcxMDljOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBSSU1BVkVSQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwN2Q5ZjdhMDlmMzQyMzA5MDBlNzdhNGE3Y2Y1NmIzLnNldENvbnRlbnQoaHRtbF8wNzUxMjliYWRkZWU0MjlkYTU0YmEzMjQ4NzEwOWM5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZDY4NGYyZDYxZDk0MWI3OTlhZTBmYmQyYWRhMTQxOC5iaW5kUG9wdXAocG9wdXBfMjA3ZDlmN2EwOWYzNDIzMDkwMGU3N2E0YTdjZjU2YjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTE5NDc3NDIzMzEwNDYyNmJlZGI3MDE3N2U5MWE0MWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODYwOTc2OSwtNDMuOTI5MDU0NjYxOTk3NDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMThhZjM2ZWUwMzA5NDU4MTg3MjdjYjI0NmU4ZTUyN2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWY4NGRjODAwMDU2NGRlN2ExMzY1NjQ5MTkxYzgyYzIgPSAkKCc8ZGl2IGlkPSJodG1sX2VmODRkYzgwMDA1NjRkZTdhMTM2NTY0OTE5MWM4MmMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QUklNRUlSTyBERSBNQUlPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMThhZjM2ZWUwMzA5NDU4MTg3MjdjYjI0NmU4ZTUyN2Iuc2V0Q29udGVudChodG1sX2VmODRkYzgwMDA1NjRkZTdhMTM2NTY0OTE5MWM4MmMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ExOTQ3NzQyMzMxMDQ2MjZiZWRiNzAxNzdlOTFhNDFlLmJpbmRQb3B1cChwb3B1cF8xOGFmMzZlZTAzMDk0NTgxODcyN2NiMjQ2ZThlNTI3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzQ0MzM3MzRkNjE0ZDMzYjcwMzZlYzI3NzAyNWE4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NTYxNTcyNTAwMDAwMDYsLTQzLjkyNjIzMTAxOTUzMzI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwNzA1ZWY3YjRlNDQxZTFiMjA3MWViZDRlY2I3ODM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2ZDBjNzI5MTQxYzQ4OGU4MjNhNTQ5ZjBlODAxYWY1ID0gJCgnPGRpdiBpZD0iaHRtbF9kNmQwYzcyOTE0MWM0ODhlODIzYTU0OWYwZTgwMWFmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UFJPVklERU5DSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMDcwNWVmN2I0ZTQ0MWUxYjIwNzFlYmQ0ZWNiNzgzNy5zZXRDb250ZW50KGh0bWxfZDZkMGM3MjkxNDFjNDg4ZTgyM2E1NDlmMGU4MDFhZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGM0NDMzNzM0ZDYxNGQzM2I3MDM2ZWMyNzcwMjVhODMuYmluZFBvcHVwKHBvcHVwX2MwNzA1ZWY3YjRlNDQxZTFiMjA3MWViZDRlY2I3ODM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1Yjk4ZmZmYTA3MDQwODViYjUyZjk1ZjUwYmM5ODA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk2NzI1NDYsLTQzLjk0MjM1NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTRkM2UwYTNkOTNjNDI2ODk5MTM0M2FiNDYxYTA3Y2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWEwZjAzNjNiZjYxNGU4NmE3MGIwNWE4ZjEwNmRkYjEgPSAkKCc8ZGl2IGlkPSJodG1sXzVhMGYwMzYzYmY2MTRlODZhNzBiMDVhOGYxMDZkZGIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SRUdJTkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NGQzZTBhM2Q5M2M0MjY4OTkxMzQzYWI0NjFhMDdjZS5zZXRDb250ZW50KGh0bWxfNWEwZjAzNjNiZjYxNGU4NmE3MGIwNWE4ZjEwNmRkYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTViOThmZmZhMDcwNDA4NWJiNTJmOTVmNTBiYzk4MDYuYmluZFBvcHVwKHBvcHVwXzU0ZDNlMGEzZDkzYzQyNjg5OTEzNDNhYjQ2MWEwN2NlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0MmQ4ODM0MTZhMjQ2NTVhM2E4ODRkMDlmNmNmNDU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgyOTE0NjQsLTQzLjg5ODQ4MzU5NjYzNzA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjZWY4YzZjYjQ1NjQyNmFiNjYwZmNjZTViNTZmMjNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhMjNmMmEzN2Y4MDQzNDBhNTcyNDQ2ODBlNTZmZTQwID0gJCgnPGRpdiBpZD0iaHRtbF9mYTIzZjJhMzdmODA0MzQwYTU3MjQ0NjgwZTU2ZmU0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UklCRUlSTyBERSBBQlJFVSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjZWY4YzZjYjQ1NjQyNmFiNjYwZmNjZTViNTZmMjNhLnNldENvbnRlbnQoaHRtbF9mYTIzZjJhMzdmODA0MzQwYTU3MjQ0NjgwZTU2ZmU0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDJkODgzNDE2YTI0NjU1YTNhODg0ZDA5ZjZjZjQ1OC5iaW5kUG9wdXAocG9wdXBfYmNlZjhjNmNiNDU2NDI2YWI2NjBmY2NlNWI1NmYyM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzg4ZTA0ZGQ1ZTlhNDBjOGExNTcyNTk3NmVlMTI1OWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODE3NzYxODAwMDAwMDAzLC00My45ODIyMjgzMDk5MTg0MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2Q3MTBlNTNjOTI0NGYzMTgyNmU1OTM5NjMyOGRjYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjdiNmYzZWIwMzRhNDZkNTljODE3NDU3OWZjNDdlZmMgPSAkKCc8ZGl2IGlkPSJodG1sXzI3YjZmM2ViMDM0YTQ2ZDU5YzgxNzQ1NzlmYzQ3ZWZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SSU8gQlJBTkNPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Q3MTBlNTNjOTI0NGYzMTgyNmU1OTM5NjMyOGRjYjAuc2V0Q29udGVudChodG1sXzI3YjZmM2ViMDM0YTQ2ZDU5YzgxNzQ1NzlmYzQ3ZWZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M4OGUwNGRkNWU5YTQwYzhhMTU3MjU5NzZlZTEyNTlmLmJpbmRQb3B1cChwb3B1cF9jZDcxMGU1M2M5MjQ0ZjMxODI2ZTU5Mzk2MzI4ZGNiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YWZmMmYwYmIwMWM0N2NjYjBmZWUwMzUzZTNkMmJmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDMxNDU1NSwtNDMuOTgyOTYzNjg1OTg0MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2ZjZTA3MmFhZTM5NDUxNWEyOGRhNTUxYzJlYjA1NjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODYwMWJjOTNmNDY0NGY0ODk2Y2VhOTlmYTJhZDFjMTkgPSAkKCc8ZGl2IGlkPSJodG1sXzg2MDFiYzkzZjQ2NDRmNDg5NmNlYTk5ZmEyYWQxYzE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQUxHQURPIEZJTEhPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2ZjZTA3MmFhZTM5NDUxNWEyOGRhNTUxYzJlYjA1Njkuc2V0Q29udGVudChodG1sXzg2MDFiYzkzZjQ2NDRmNDg5NmNlYTk5ZmEyYWQxYzE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhZmYyZjBiYjAxYzQ3Y2NiMGZlZTAzNTNlM2QyYmY5LmJpbmRQb3B1cChwb3B1cF9jZmNlMDcyYWFlMzk0NTE1YTI4ZGE1NTFjMmViMDU2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGU0NmU5YTBjNDk0YWQyYjk3NzE3MjQzZjVkZWRjMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzkwMDEzMDAwMDAwMDIsLTQzLjk0MTEwNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRjMGZlZGI0NWRhNGUzMmFjYTFiZDI0YmFiZDA4YzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2EyNmI1NmRlZjc1NGQ3MTk3NDNjZjZhOTIzMjFhZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzNhMjZiNTZkZWY3NTRkNzE5NzQzY2Y2YTkyMzIxYWRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQU5UQSBDUlVaIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDRjMGZlZGI0NWRhNGUzMmFjYTFiZDI0YmFiZDA4Yzguc2V0Q29udGVudChodG1sXzNhMjZiNTZkZWY3NTRkNzE5NzQzY2Y2YTkyMzIxYWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0ZTQ2ZTlhMGM0OTRhZDJiOTc3MTcyNDNmNWRlZGMyLmJpbmRQb3B1cChwb3B1cF80NGMwZmVkYjQ1ZGE0ZTMyYWNhMWJkMjRiYWJkMDhjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMzM3ODRiZjU0MDE0MDM0YTEyYjMyYmM3NjAwMjY4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45ODY3NzQ1LC00NC4wMTE2MDQ3MDc3MDA5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jY2Y5ODg5ZDlmMGU0ZDg0OGU4YjExN2JlMzNkNDhjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjRkNDk4NGQwYjY0MDJiOTYzMTMzNjliYjE5YmVmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGY0ZDQ5ODRkMGI2NDAyYjk2MzEzMzY5YmIxOWJlZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBTlRBIEhFTEVOQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjZjk4ODlkOWYwZTRkODQ4ZThiMTE3YmUzM2Q0OGNjLnNldENvbnRlbnQoaHRtbF84ZjRkNDk4NGQwYjY0MDJiOTYzMTMzNjliYjE5YmVmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzM3ODRiZjU0MDE0MDM0YTEyYjMyYmM3NjAwMjY4Ni5iaW5kUG9wdXAocG9wdXBfY2NmOTg4OWQ5ZjBlNGQ4NDhlOGIxMTdiZTMzZDQ4Y2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjI2M2UzNmNjODk4NDI3YjhiYWIzMmY1NTgxZThjODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODIzNzgyOTUsLTQzLjk3NDUyOTY0MDAzMjU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiZDFlOTMwYWVmMzRhYzU4NzhmNTQwMDBiZGFiZTVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxZThhMjc2MjdkYTQ5MjlhM2Q3Y2YxYTQ0ZTk0OTIxID0gJCgnPGRpdiBpZD0iaHRtbF8yMWU4YTI3NjI3ZGE0OTI5YTNkN2NmMWE0NGU5NDkyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0FOVEEgTU9OSUNBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGJkMWU5MzBhZWYzNGFjNTg3OGY1NDAwMGJkYWJlNWYuc2V0Q29udGVudChodG1sXzIxZThhMjc2MjdkYTQ5MjlhM2Q3Y2YxYTQ0ZTk0OTIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyNjNlMzZjYzg5ODQyN2I4YmFiMzJmNTU4MWU4Yzg1LmJpbmRQb3B1cChwb3B1cF84YmQxZTkzMGFlZjM0YWM1ODc4ZjU0MDAwYmRhYmU1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOWJmYzk1MTFlMGU0NTkwOTc2Y2JmOTE5N2ZkZDVhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzEzMjUzLC00NC4wMDQwNjA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3MzhmNzRlM2VmMDRiMzFhZjAyYmFmMmQ5ZjJhMTZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkMWFhMTY1NzQzODQ5YzRhYmIwMGNjNTg1ZGE0NzJiID0gJCgnPGRpdiBpZD0iaHRtbF9lZDFhYTE2NTc0Mzg0OWM0YWJiMDBjYzU4NWRhNDcyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0FOVEEgVEVSRVpJTkhBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjczOGY3NGUzZWYwNGIzMWFmMDJiYWYyZDlmMmExNmMuc2V0Q29udGVudChodG1sX2VkMWFhMTY1NzQzODQ5YzRhYmIwMGNjNTg1ZGE0NzJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5YmZjOTUxMWUwZTQ1OTA5NzZjYmY5MTk3ZmRkNWE0LmJpbmRQb3B1cChwb3B1cF9iNzM4Zjc0ZTNlZjA0YjMxYWYwMmJhZjJkOWYyYTE2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjhkNDVmOGY3ODk0NmY1OTNmYjUyOTQ1MjdmMjc4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MDI5OTgyLC00My45NTQwMDU1ODM5MzIzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZWVlMjRmNGIyMGE0ODdkYTljZTIzNTczYWFhNTNkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNmE1NjczNzk1NGM0MzY2OGYyYzE3YTNhZDY0M2M2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjZhNTY3Mzc5NTRjNDM2NjhmMmMxN2EzYWQ2NDNjNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBTlRPIEFORFJFIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmVlZTI0ZjRiMjBhNDg3ZGE5Y2UyMzU3M2FhYTUzZDQuc2V0Q29udGVudChodG1sX2Y2YTU2NzM3OTU0YzQzNjY4ZjJjMTdhM2FkNjQzYzZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyOGQ0NWY4Zjc4OTQ2ZjU5M2ZiNTI5NDUyN2YyNzg1LmJpbmRQb3B1cChwb3B1cF9mZWVlMjRmNGIyMGE0ODdkYTljZTIzNTczYWFhNTNkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODJmMDlkZmNlNGQ0M2NkOTk5YjkyMjViNmVjYzUzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NTAzMDM2OTk5OTk5OTgsLTQzLjkzNzk4ODQ2MDUyNDc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxNDU2OTI0ODVmMjQwNWU4OTNjMzQ5N2Y5Y2NiZjMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxYTZhOTg0YTkyNjQzY2I4ZDUwOWZlNGJlMzgzODg5ID0gJCgnPGRpdiBpZD0iaHRtbF8zMWE2YTk4NGE5MjY0M2NiOGQ1MDlmZTRiZTM4Mzg4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U8ODTyBCRVJOQVJETyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxNDU2OTI0ODVmMjQwNWU4OTNjMzQ5N2Y5Y2NiZjMwLnNldENvbnRlbnQoaHRtbF8zMWE2YTk4NGE5MjY0M2NiOGQ1MDlmZTRiZTM4Mzg4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODJmMDlkZmNlNGQ0M2NkOTk5YjkyMjViNmVjYzUzNy5iaW5kUG9wdXAocG9wdXBfMDE0NTY5MjQ4NWYyNDA1ZTg5M2MzNDk3ZjljY2JmMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWY0ODEyY2ExNGYzNGVhMThhM2RlNzIyYTYyYmZlYmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTAxMDIyMTk5OTk5OTk2LC00My45NDUyNzc2MTgxMzYwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODdmYmVkMTA0OTY0ZjcxODk0ZjU1N2JjNjdkMTFkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjI3ZDQ5YzdhYjQ0NDI2OTg3ZWE2M2MyNzZkYzlhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGIyN2Q0OWM3YWI0NDQyNjk4N2VhNjNjMjc2ZGM5YTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gQ1JJU1RPVkFPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTg3ZmJlZDEwNDk2NGY3MTg5NGY1NTdiYzY3ZDExZDQuc2V0Q29udGVudChodG1sXzBiMjdkNDljN2FiNDQ0MjY5ODdlYTYzYzI3NmRjOWEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmNDgxMmNhMTRmMzRlYTE4YTNkZTcyMmE2MmJmZWJmLmJpbmRQb3B1cChwb3B1cF85ODdmYmVkMTA0OTY0ZjcxODk0ZjU1N2JjNjdkMTFkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjU5MWQ2YTA4NDM0Njg5OGYwNjM1OWM5NzEzNWJiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NTU1MTg1NSwtNDMuOTE0NjM2NzUzODg2NjU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzMjhiY2I1MjI3NzQzNjdhMjliZmUwM2JhNTAwOTY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjNGQ3MTU5ZGFlNjRjYTY4ZWQyZTMwYjM5ODdmMDllID0gJCgnPGRpdiBpZD0iaHRtbF83YzRkNzE1OWRhZTY0Y2E2OGVkMmUzMGIzOTg3ZjA5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U8ODTyBHQUJSSUVMIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTMyOGJjYjUyMjc3NDM2N2EyOWJmZTAzYmE1MDA5NjQuc2V0Q29udGVudChodG1sXzdjNGQ3MTU5ZGFlNjRjYTY4ZWQyZTMwYjM5ODdmMDllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmNTkxZDZhMDg0MzQ2ODk4ZjA2MzU5Yzk3MTM1YmI3LmJpbmRQb3B1cChwb3B1cF9lMzI4YmNiNTIyNzc0MzY3YTI5YmZlMDNiYTUwMDk2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OTBkNTIzZDgyOWQ0YWY4YWYxMTBjMWYzM2YwZjgxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTkyNDU4NSwtNDMuODk3NjUwNTQ3MTM1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNWY5ZDdkMWY2ZDY0ODRhOTJjNmE0M2E1NWZjMzkxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDQ2MTMzYzZlYjk0MmM4OWU2YTZiMTg5MTg1NmJkOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTA0NjEzM2M2ZWI5NDJjODllNmE2YjE4OTE4NTZiZDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gR0VSQUxETyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1ZjlkN2QxZjZkNjQ4NGE5MmM2YTQzYTU1ZmMzOTEwLnNldENvbnRlbnQoaHRtbF81MDQ2MTMzYzZlYjk0MmM4OWU2YTZiMTg5MTg1NmJkOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OTBkNTIzZDgyOWQ0YWY4YWYxMTBjMWYzM2YwZjgxOS5iaW5kUG9wdXAocG9wdXBfMTVmOWQ3ZDFmNmQ2NDg0YTkyYzZhNDNhNTVmYzM5MTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODc0MmI4MGQ0YmRjNDQyZTlmMjRiODc0ZDgzOTgyYWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODIyNjI1MTk5OTk5OTk3LC00My45NTc5NTE1MTc0NzQ5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMGVkYTIxZTE3YTA0NDc2YmQxM2RlZTBmOTQwNDRhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNGY1NWY5YjI4Y2U0ZGNlODdlZTY4OGQ0OGNmYWFjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDRmNTVmOWIyOGNlNGRjZTg3ZWU2ODhkNDhjZmFhY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gSk9BTyBCQVRJU1RBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTBlZGEyMWUxN2EwNDQ3NmJkMTNkZWUwZjk0MDQ0YTAuc2V0Q29udGVudChodG1sX2Q0ZjU1ZjliMjhjZTRkY2U4N2VlNjg4ZDQ4Y2ZhYWNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3NDJiODBkNGJkYzQ0MmU5ZjI0Yjg3NGQ4Mzk4MmFlLmJpbmRQb3B1cChwb3B1cF9hMGVkYTIxZTE3YTA0NDc2YmQxM2RlZTBmOTQwNDRhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYWY2ZDVlNWZlZDY0YjI2OWY4NWEwODE1OWU0MGM3ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzExMTUxNSwtNDMuOTEwMzU5Mzc3NzUzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3OTVlYTYzOGY1YzQzYTFiNjcwMzU5MzJmYjg3MjFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3MTQwM2MzYTFiNzRlYzViYzM0ZjcxYWVjOTJkMWU5ID0gJCgnPGRpdiBpZD0iaHRtbF9hNzE0MDNjM2ExYjc0ZWM1YmMzNGY3MWFlYzkyZDFlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U8ODTyBNQVJDT1MgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzk1ZWE2MzhmNWM0M2ExYjY3MDM1OTMyZmI4NzIxYi5zZXRDb250ZW50KGh0bWxfYTcxNDAzYzNhMWI3NGVjNWJjMzRmNzFhZWM5MmQxZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmFmNmQ1ZTVmZWQ2NGIyNjlmODVhMDgxNTllNDBjN2YuYmluZFBvcHVwKHBvcHVwX2M3OTVlYTYzOGY1YzQzYTFiNjcwMzU5MzJmYjg3MjFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwMGQ2MWJlNmJiNTRjZmY5ZTQwYmExMWI3MzdiM2UxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg2ODY4Nzc1LC00My45MjM5MzY4MTgxMDMwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOTQ4OTQxZTY2NWY0ZWQ1YTcxN2JmMmZkMjY2MTU0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZTljN2IxMDI5NDc0MDg2ODBjZTk5ZjUyODEzN2JjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWU5YzdiMTAyOTQ3NDA4NjgwY2U5OWY1MjgxMzdiY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gUEFVTE8gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOTQ4OTQxZTY2NWY0ZWQ1YTcxN2JmMmZkMjY2MTU0Yy5zZXRDb250ZW50KGh0bWxfYWU5YzdiMTAyOTQ3NDA4NjgwY2U5OWY1MjgxMzdiY2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzAwZDYxYmU2YmI1NGNmZjllNDBiYTExYjczN2IzZTEuYmluZFBvcHVwKHBvcHVwX2I5NDg5NDFlNjY1ZjRlZDVhNzE3YmYyZmQyNjYxNTRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2YzZmMjIwYTg5MDQ0OThiOWQ5ODhhMThkNjMwNTVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk0NzY1OTA1LC00My45Mzc1MDk0NzI2MjcwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMjJhYTc4YjcwNWY0YzhlOGJiMzIzMmM4MTAyNjJlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mM2FiMzM0YWZjMzI0Y2QwODczNTIxMDJkNjc1ZjE1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjNhYjMzNGFmYzMyNGNkMDg3MzUyMTAyZDY3NWYxNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBTyBQRURSTyBWTiBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyMmFhNzhiNzA1ZjRjOGU4YmIzMjMyYzgxMDI2MmUzLnNldENvbnRlbnQoaHRtbF9mM2FiMzM0YWZjMzI0Y2QwODczNTIxMDJkNjc1ZjE1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NmM2ZjIyMGE4OTA0NDk4YjlkOTg4YTE4ZDYzMDU1YS5iaW5kUG9wdXAocG9wdXBfMzIyYWE3OGI3MDVmNGM4ZThiYjMyMzJjODEwMjYyZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGEwYWQ0ZDQ2ODlhNDA2NWI1YjlkMzA2Yjc2M2JlNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODkzOTMwNCwtNDQuMDEzMzMzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNjcyOTQxMjA3OWY0MmI0YmI1NTE1YTdlYzlhMDNkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTY1NTZjZmNhZGQ0MjExOTE5YTQ1NDZmZTZkM2JkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjE2NTU2Y2ZjYWRkNDIxMTkxOWE0NTQ2ZmU2ZDNiZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gU0FMVkFET1IgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjcyOTQxMjA3OWY0MmI0YmI1NTE1YTdlYzlhMDNkOS5zZXRDb250ZW50KGh0bWxfZjE2NTU2Y2ZjYWRkNDIxMTkxOWE0NTQ2ZmU2ZDNiZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGEwYWQ0ZDQ2ODlhNDA2NWI1YjlkMzA2Yjc2M2JlNzUuYmluZFBvcHVwKHBvcHVwX2U2NzI5NDEyMDc5ZjQyYjRiYjU1MTVhN2VjOWEwM2Q5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjYWIxYmZmNmRmMDQ2YWNiMGY1MDk3ODZiOTcwZDBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIwLjM5OTgyMzg5OTk5OTk5OCwtNDMuNTE3MTc4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNjFlOGM5MjlkNDM0MGJlYjhkNjgyNWY4OTNhMDRjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YjBhNjZmMDYyZTA0ZjVkYWExZWFjZDc0NDdmOGQ5NiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGIwYTY2ZjA2MmUwNGY1ZGFhMWVhY2Q3NDQ3ZjhkOTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBUkFNRU5IQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2MWU4YzkyOWQ0MzQwYmViOGQ2ODI1Zjg5M2EwNGM3LnNldENvbnRlbnQoaHRtbF84YjBhNjZmMDYyZTA0ZjVkYWExZWFjZDc0NDdmOGQ5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jY2FiMWJmZjZkZjA0NmFjYjBmNTA5Nzg2Yjk3MGQwZi5iaW5kUG9wdXAocG9wdXBfYTYxZThjOTI5ZDQzNDBiZWI4ZDY4MjVmODkzYTA0YzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzA5ZDJkMjljMDY4NDhjNzhiMjRjZDNiZjlmZWUzOTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODYxOTM3NywtNDMuOTk4MTI2MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MjU1NTNjMDJjOWQ0MzM0ODBlODJjYWFkNmRmZjQ2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNzM0NWExNDdjNWI0NDg4YmViMTM5YjBlMDg1OGMyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjczNDVhMTQ3YzViNDQ4OGJlYjEzOWIwZTA4NThjMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBUkFOREkgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjU1NTNjMDJjOWQ0MzM0ODBlODJjYWFkNmRmZjQ2MS5zZXRDb250ZW50KGh0bWxfMjczNDVhMTQ3YzViNDQ4OGJlYjEzOWIwZTA4NThjMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzA5ZDJkMjljMDY4NDhjNzhiMjRjZDNiZjlmZWUzOTkuYmluZFBvcHVwKHBvcHVwXzUyNTU1M2MwMmM5ZDQzMzQ4MGU4MmNhYWQ2ZGZmNDYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkYTc1Yzc3OWVkYjQ2NzliYWVmMjc0NzNkMDBlYzg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkxNTA2NjA1LC00My44OTkwOTg3NDI0MjYyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNGE2MjcxN2U4OTY0ODg3OWZkYmVmNmE1NTQwMjg1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTY0MTIzMDE3NDc0MGZlYjJlMTZmZmVjMTg3MzMyMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmU2NDEyMzAxNzQ3NDBmZWIyZTE2ZmZlYzE4NzMzMjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBVURBREUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNGE2MjcxN2U4OTY0ODg3OWZkYmVmNmE1NTQwMjg1Ny5zZXRDb250ZW50KGh0bWxfYmU2NDEyMzAxNzQ3NDBmZWIyZTE2ZmZlYzE4NzMzMjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRhNzVjNzc5ZWRiNDY3OWJhZWYyNzQ3M2QwMGVjODcuYmluZFBvcHVwKHBvcHVwX2Q0YTYyNzE3ZTg5NjQ4ODc5ZmRiZWY2YTU1NDAyODU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4ZGQ2YzRiMjEzMzRhM2M4MzEzNmZjY2NlMmM4NjNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIwLjAyODAxMjg1LC00NC4wMDc2NjgzOTI4OTM3MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MjU4MDE5NzBiNTM0ZjBiYjdmMWY4NDk4YzlmMWQyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMjUxZmE2ZTZiY2Y0NWIwYjgxMTZhMDFmNGQ0YjI5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjI1MWZhNmU2YmNmNDViMGI4MTE2YTAxZjRkNGIyOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFUlJBIERPIENVUlJBTCBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyNTgwMTk3MGI1MzRmMGJiN2YxZjg0OThjOWYxZDI0LnNldENvbnRlbnQoaHRtbF9iMjUxZmE2ZTZiY2Y0NWIwYjgxMTZhMDFmNGQ0YjI5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OGRkNmM0YjIxMzM0YTNjODMxMzZmY2NjZTJjODYzYy5iaW5kUG9wdXAocG9wdXBfNjI1ODAxOTcwYjUzNGYwYmI3ZjFmODQ5OGM5ZjFkMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjU5NGZmNWMwYjljNDBmYzg3YWIyZjQ4Yzk5ZWNlMWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuNzkyNzQ3NjUwMDAwMDA2LC00My45NTYxOTQwNzQ3NDYxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MDMxNjc3N2FhZTA0ZjBkYTE2NTRmZTYxOWIyY2Q2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzYyZGRlNmIzOTU0OGY4OTVhNTU3OGUwZmJhNjY3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfODM2MmRkZTZiMzk1NDhmODk1YTU1NzhlMGZiYTY2N2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFUlJBIFZFUkRFIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTAzMTY3NzdhYWUwNGYwZGExNjU0ZmU2MTliMmNkNjUuc2V0Q29udGVudChodG1sXzgzNjJkZGU2YjM5NTQ4Zjg5NWE1NTc4ZTBmYmE2NjdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1OTRmZjVjMGI5YzQwZmM4N2FiMmY0OGM5OWVjZTFlLmJpbmRQb3B1cChwb3B1cF81MDMxNjc3N2FhZTA0ZjBkYTE2NTRmZTYxOWIyY2Q2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xN2VkZGYxNDVmNWM0ZWQyODllMDE3M2ExM2EyZDM5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44ODA0MzE1LC00NC4wMTI3NTQzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmNTQ3MzE1ODNkZjRiOWM5ZGRjNmMzMTgwZjUzMWEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzZjVhZTQyNWIzMDRmOTdhNDE0M2YxZGFiZmQ2NTg1ID0gJCgnPGRpdiBpZD0iaHRtbF9jM2Y1YWU0MjViMzA0Zjk3YTQxNDNmMWRhYmZkNjU4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VSUkFOTyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmNTQ3MzE1ODNkZjRiOWM5ZGRjNmMzMTgwZjUzMWEyLnNldENvbnRlbnQoaHRtbF9jM2Y1YWU0MjViMzA0Zjk3YTQxNDNmMWRhYmZkNjU4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xN2VkZGYxNDVmNWM0ZWQyODllMDE3M2ExM2EyZDM5Mi5iaW5kUG9wdXAocG9wdXBfZGY1NDczMTU4M2RmNGI5YzlkZGM2YzMxODBmNTMxYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmNjYmM0MWQ1ZmM3NGM4MWFhYjczMDQ4MjllN2MzMDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODIxNzc5LC00My45ODExNTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3YzZmYjU3Zjc1YjQ4MGZhOTQ1NGJmNzQ2NTYyMjMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyNGRmYjM3ZjA0MzQ4MjRiZjc4M2JlYmEzOGQ5NDc0ID0gJCgnPGRpdiBpZD0iaHRtbF80MjRkZmIzN2YwNDM0ODI0YmY3ODNiZWJhMzhkOTQ3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0lOSU1CVSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3YzZmYjU3Zjc1YjQ4MGZhOTQ1NGJmNzQ2NTYyMjMyLnNldENvbnRlbnQoaHRtbF80MjRkZmIzN2YwNDM0ODI0YmY3ODNiZWJhMzhkOTQ3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iY2NiYzQxZDVmYzc0YzgxYWFiNzMwNDgyOWU3YzMwNy5iaW5kUG9wdXAocG9wdXBfYzdjNmZiNTdmNzViNDgwZmE5NDU0YmY3NDY1NjIyMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWVmNjQ2MjhiMGM0NDY0Mjg1MjFhYmQ1NjUzYzZlZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODIxODMyMTUsLTQzLjkyNjcyMTUzMTY2MTI2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODUyZmRkMTdmMzM0ZWIyYWYzOWRmN2EyYjg1YzAxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZjgxNmI4MWVlY2E0NjU0YWY2NzdkNTgxMWFiZDQ3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWY4MTZiODFlZWNhNDY1NGFmNjc3ZDU4MTFhYmQ0NzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNPTElNT0VTIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjg1MmZkZDE3ZjMzNGViMmFmMzlkZjdhMmI4NWMwMTQuc2V0Q29udGVudChodG1sX2VmODE2YjgxZWVjYTQ2NTRhZjY3N2Q1ODExYWJkNDc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlZjY0NjI4YjBjNDQ2NDI4NTIxYWJkNTY1M2M2ZWViLmJpbmRQb3B1cChwb3B1cF9mODUyZmRkMTdmMzM0ZWIyYWYzOWRmN2EyYjg1YzAxNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjU3YjM2OWEyMWU0YTU4Yjk0OWQxNmY5NmFhOWQyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44ODY0NzMwNSwtNDMuOTY1ODY1NDI3Mjk2MDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWE0MGRhM2QwMzdkNDVjMmEwY2Y0YTlkOTFjMzUzZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWFhMDUyZDFhZjdhNGE0NzhkMzkzM2ExNGM4ZTNkMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2VhYTA1MmQxYWY3YTRhNDc4ZDM5MzNhMTRjOGUzZDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVU1BUkUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTQwZGEzZDAzN2Q0NWMyYTBjZjRhOWQ5MWMzNTNkYS5zZXRDb250ZW50KGh0bWxfZWFhMDUyZDFhZjdhNGE0NzhkMzkzM2ExNGM4ZTNkMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2I1N2IzNjlhMjFlNGE1OGI5NDlkMTZmOTZhYTlkMjIuYmluZFBvcHVwKHBvcHVwXzVhNDBkYTNkMDM3ZDQ1YzJhMGNmNGE5ZDkxYzM1M2RhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllOWJmZjFmNGNkODQ5N2RhYjdhODIyMGE5YjAzZDdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg2NTI3Nzk1LC00My45MzM0MjYwNjQxOTEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNjhiYzJlY2EyNWY0YTAxOWE5ZTMwYjkyY2U2Y2Q3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTlhMGQyNDQ4ODI0OGYyODViNjZkMzEyM2Y1YTMxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTk5YTBkMjQ0ODgyNDhmMjg1YjY2ZDMxMjNmNWEzMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNVWkFOQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2OGJjMmVjYTI1ZjRhMDE5YTllMzBiOTJjZTZjZDc5LnNldENvbnRlbnQoaHRtbF9hOTlhMGQyNDQ4ODI0OGYyODViNjZkMzEyM2Y1YTMxZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZTliZmYxZjRjZDg0OTdkYWI3YTgyMjBhOWIwM2Q3Yy5iaW5kUG9wdXAocG9wdXBfMjY4YmMyZWNhMjVmNGEwMTlhOWUzMGI5MmNlNmNkNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ExZDRlNDY1ODkyNGVkY2I0YzZlOTJhMWVjNmMxMWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTE3NjA3ODAwMDAwMDAzLC00My44ODU5Mzg4MTU4Mjg0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYTM0NWM3YTc1MDU0MTI4OThlNWQ2YjExYjAyMWM3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNzVkN2M1YmVkZGQ0N2MyYjZjYjQ1OTllMWRmOWRhYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTc1ZDdjNWJlZGRkNDdjMmI2Y2I0NTk5ZTFkZjlkYWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRBUVVBUklMIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGEzNDVjN2E3NTA1NDEyODk4ZTVkNmIxMWIwMjFjN2Quc2V0Q29udGVudChodG1sX2U3NWQ3YzViZWRkZDQ3YzJiNmNiNDU5OWUxZGY5ZGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhMWQ0ZTQ2NTg5MjRlZGNiNGM2ZTkyYTFlYzZjMTFhLmJpbmRQb3B1cChwb3B1cF9kYTM0NWM3YTc1MDU0MTI4OThlNWQ2YjExYjAyMWM3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYzdlNzQxZGQ3MzU0ZjhhOWQ2MTVjNWVkZGFmOWVhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45ODgzMjIyLC00NC4wNDA3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmI1Y2FiODg5MDViNGJmNzhlODkwYmVkYjc0YjE1MDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmVlNTEyZWQ0ODg1NGFiMjgzYzcwYTdlOGM4ZmJlNjMgPSAkKCc8ZGl2IGlkPSJodG1sXzZlZTUxMmVkNDg4NTRhYjI4M2M3MGE3ZThjOGZiZTYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5USVJPTCBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiNWNhYjg4OTA1YjRiZjc4ZTg5MGJlZGI3NGIxNTAxLnNldENvbnRlbnQoaHRtbF82ZWU1MTJlZDQ4ODU0YWIyODNjNzBhN2U4YzhmYmU2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzdlNzQxZGQ3MzU0ZjhhOWQ2MTVjNWVkZGFmOWVhZS5iaW5kUG9wdXAocG9wdXBfMmI1Y2FiODg5MDViNGJmNzhlODkwYmVkYjc0YjE1MDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JhMzkxZDgzZDRiNDg4YmI0MTc3YTdmYWM4NzExNTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODM2ODEyODk5OTk5OTk4LC00NC4wMTA4ODMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYzMWM5YjY1ZTAxYjQzNjliYjM2ZGQ2ODdjNDUzZWY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4NzA3M2ViOTJiZjRkN2E5ZjBjNmQyOTFjZjMzNGJiID0gJCgnPGRpdiBpZD0iaHRtbF80ODcwNzNlYjkyYmY0ZDdhOWYwYzZkMjkxY2YzMzRiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VFJFVk8gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzFjOWI2NWUwMWI0MzY5YmIzNmRkNjg3YzQ1M2VmNC5zZXRDb250ZW50KGh0bWxfNDg3MDczZWI5MmJmNGQ3YTlmMGM2ZDI5MWNmMzM0YmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2JhMzkxZDgzZDRiNDg4YmI0MTc3YTdmYWM4NzExNTEuYmluZFBvcHVwKHBvcHVwXzYzMWM5YjY1ZTAxYjQzNjliYjM2ZGQ2ODdjNDUzZWY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2MTVhYmZmMjI5ZjQ3YzU4ZTViMzUwZmJkOTAwMjI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgzNjYzMzQ1LC00My45MjU1NTY3NzI5MzU5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NmEzYzAxYWExNjY0OTMwYmIzYWY1MmEzMGE2MjJkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDg3ZTBhMDU0NDI0ZmIyOWQyNjFlODUwOTMxYTZjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTA4N2UwYTA1NDQyNGZiMjlkMjYxZTg1MDkzMWE2YzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRVUEkgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NmEzYzAxYWExNjY0OTMwYmIzYWY1MmEzMGE2MjJkZS5zZXRDb250ZW50KGh0bWxfNTA4N2UwYTA1NDQyNGZiMjlkMjYxZTg1MDkzMWE2YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjYxNWFiZmYyMjlmNDdjNThlNWIzNTBmYmQ5MDAyMjkuYmluZFBvcHVwKHBvcHVwXzg2YTNjMDFhYTE2NjQ5MzBiYjNhZjUyYTMwYTYyMmRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4MTVlZDFmZTBhZTQ4NjI5ZTMyMzlkNzBlZmRiMTU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg4MDkyNzQsLTQzLjkyMzQ1NzQ5OTA5MjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0ODBmNWRiZDg1YjQyYzM5YTI3YmU0ZmM0YzBjOWZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1YWY0OWRhMjc0YTQzYTFiNDUyNzY1MGQ1NDgwNDg4ID0gJCgnPGRpdiBpZD0iaHRtbF84NWFmNDlkYTI3NGE0M2ExYjQ1Mjc2NTBkNTQ4MDQ4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VU5JQU8gQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDgwZjVkYmQ4NWI0MmMzOWEyN2JlNGZjNGMwYzlmZi5zZXRDb250ZW50KGh0bWxfODVhZjQ5ZGEyNzRhNDNhMWI0NTI3NjUwZDU0ODA0ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzgxNWVkMWZlMGFlNDg2MjllMzIzOWQ3MGVmZGIxNTcuYmluZFBvcHVwKHBvcHVwXzU0ODBmNWRiZDg1YjQyYzM5YTI3YmU0ZmM0YzBjOWZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk4MTExODkxMTM2YTRjMzdhOGFhMDU3YTBkNmY4MDg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg2NzQxMzYwMDAwMDAwMywtNDMuOTQxNTc3MDc3Njg2MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGQwODY3ZjgxZTkwNGYxY2JiZWI4NjZjNTU1M2EyYzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRiOGRlZmU4YzQxNDI3NDhlYWVjNzJhNGQ1NDY4MGIgPSAkKCc8ZGl2IGlkPSJodG1sXzc0YjhkZWZlOGM0MTQyNzQ4ZWFlYzcyYTRkNTQ2ODBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VTklWRVJTSVRBUklPIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQwODY3ZjgxZTkwNGYxY2JiZWI4NjZjNTU1M2EyYzQuc2V0Q29udGVudChodG1sXzc0YjhkZWZlOGM0MTQyNzQ4ZWFlYzcyYTRkNTQ2ODBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4MTExODkxMTM2YTRjMzdhOGFhMDU3YTBkNmY4MDg2LmJpbmRQb3B1cChwb3B1cF80ZDA4NjdmODFlOTA0ZjFjYmJlYjg2NmM1NTUzYTJjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OGFiOGI1ZWI3YzU0YWMyOTRiYmE1MDlmYTAyMjA5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS42NDAwMDAyLC00NC4zNTY3ODg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViNjhiMWQ0NWY3OTRjNzJiNGNlOThjZDIzYzg0OTViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2ZGI1ZDM4OGEwMjRhZjE5NjI4MmQ2NjgyZDQxODhkID0gJCgnPGRpdiBpZD0iaHRtbF8wNmRiNWQzODhhMDI0YWYxOTYyODJkNjY4MmQ0MTg4ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VVJVQ1VJQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViNjhiMWQ0NWY3OTRjNzJiNGNlOThjZDIzYzg0OTViLnNldENvbnRlbnQoaHRtbF8wNmRiNWQzODhhMDI0YWYxOTYyODJkNjY4MmQ0MTg4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OGFiOGI1ZWI3YzU0YWMyOTRiYmE1MDlmYTAyMjA5Ni5iaW5kUG9wdXAocG9wdXBfZWI2OGIxZDQ1Zjc5NGM3MmI0Y2U5OGNkMjNjODQ5NWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTk2MTczODkzMDNiNGMxMGJmN2M0OTAxZWQwZjBlYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAuMDA3MTUwNzUsLTQ0LjAzODQ2ODgzNTg1NTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0MzgwNzZmZWVjZTRiMGY4ZjlhZWI2ODNlMzc2YzgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4N2MyYTU1NTYwNzQwZDlhMjJjODU4MzY4NDYzMTg5ID0gJCgnPGRpdiBpZD0iaHRtbF8zODdjMmE1NTU2MDc0MGQ5YTIyYzg1ODM2ODQ2MzE4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFMRSBETyBKQVRPQkEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNDM4MDc2ZmVlY2U0YjBmOGY5YWViNjgzZTM3NmM4MS5zZXRDb250ZW50KGh0bWxfMzg3YzJhNTU1NjA3NDBkOWEyMmM4NTgzNjg0NjMxODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTk2MTczODkzMDNiNGMxMGJmN2M0OTAxZWQwZjBlYzkuYmluZFBvcHVwKHBvcHVwXzA0MzgwNzZmZWVjZTRiMGY4ZjlhZWI2ODNlMzc2YzgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjMjY3OThhMDQ5ZTQxMWZhYzc1ZDQxNjM4MmVlYWM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkxMDI3NDgwMDAwMDAwMywtNDMuODk2NzA1MTYxMjE1NjE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMmQzMmNkNmE0YzRjYTliMDI4NmJkNzJiMDI2Y2E0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3OGNjOTkzNWYxODQ2NjY4YTFjYTk2YjUzYjNhNzRkID0gJCgnPGRpdiBpZD0iaHRtbF84NzhjYzk5MzVmMTg0NjY2OGExY2E5NmI1M2IzYTc0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkVSQSBDUlVaIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDEyZDMyY2Q2YTRjNGNhOWIwMjg2YmQ3MmIwMjZjYTQuc2V0Q29udGVudChodG1sXzg3OGNjOTkzNWYxODQ2NjY4YTFjYTk2YjUzYjNhNzRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjMjY3OThhMDQ5ZTQxMWZhYzc1ZDQxNjM4MmVlYWM3LmJpbmRQb3B1cChwb3B1cF8wMTJkMzJjZDZhNGM0Y2E5YjAyODZiZDcyYjAyNmNhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNmM3ZGYxM2ZkMzk0ZGY4YmQwNzNlNzFlZWEzMTc1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MTQyMDg4OTk5OTk5OTcsLTQzLjk2MjIwMzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWRjM2ZhZDMzNDdjNGQ5ZTg2MWE3MWIzNjE5M2M0NGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2M3ZDAwNzg0MmJjNGIyYzg2OWRiMDlmNDQwOGIwOTMgPSAkKCc8ZGl2IGlkPSJodG1sXzNjN2QwMDc4NDJiYzRiMmM4NjlkYjA5ZjQ0MDhiMDkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WSUxBIEJSQVNJTElBIENsYXNzIGxvdzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRjM2ZhZDMzNDdjNGQ5ZTg2MWE3MWIzNjE5M2M0NGYuc2V0Q29udGVudChodG1sXzNjN2QwMDc4NDJiYzRiMmM4NjlkYjA5ZjQ0MDhiMDkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI2YzdkZjEzZmQzOTRkZjhiZDA3M2U3MWVlYTMxNzViLmJpbmRQb3B1cChwb3B1cF9lZGMzZmFkMzM0N2M0ZDllODYxYTcxYjM2MTkzYzQ0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZGNkZTQzYThjN2Y0ZTE1OThmMTc4MGI1OTY1ZjMxYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MzQ5OTM1LC00My45MDg4NTgyNTYxMTM2NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjlmYjM4ZWRhMWYzNDAyNzhlMzllN2VhNDg5OTUzMWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWQwN2Q0MTEzMmI4NDk0MGE2YmYxZjdmOTA2NzczMWEgPSAkKCc8ZGl2IGlkPSJodG1sXzVkMDdkNDExMzJiODQ5NDBhNmJmMWY3ZjkwNjc3MzFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WSUxBIENBRkVaQUwgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOWZiMzhlZGExZjM0MDI3OGUzOWU3ZWE0ODk5NTMxYi5zZXRDb250ZW50KGh0bWxfNWQwN2Q0MTEzMmI4NDk0MGE2YmYxZjdmOTA2NzczMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRjZGU0M2E4YzdmNGUxNTk4ZjE3ODBiNTk2NWYzMWMuYmluZFBvcHVwKHBvcHVwX2I5ZmIzOGVkYTFmMzQwMjc4ZTM5ZTdlYTQ4OTk1MzFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4YmY5NWIxYWZhZTRmMzNiMmZmNzYxNGU4NzViMTU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk5NTQzMjgwMDAwMDAwMywtNDMuOTkyMzY2NTczODA1MTE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0ZGY0YjdmNDE3YTRhM2E5MmRkMWNjZDkzNTVkNTQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzNTQxMmE4ODJiZTQxNzFhY2EzY2U5YzU4YjEyNjM3ID0gJCgnPGRpdiBpZD0iaHRtbF9lMzU0MTJhODgyYmU0MTcxYWNhM2NlOWM1OGIxMjYzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VklMQSBDRU1JRyBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0ZGY0YjdmNDE3YTRhM2E5MmRkMWNjZDkzNTVkNTQ3LnNldENvbnRlbnQoaHRtbF9lMzU0MTJhODgyYmU0MTcxYWNhM2NlOWM1OGIxMjYzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOGJmOTViMWFmYWU0ZjMzYjJmZjc2MTRlODc1YjE1NS5iaW5kUG9wdXAocG9wdXBfNjRkZjRiN2Y0MTdhNGEzYTkyZGQxY2NkOTM1NWQ1NDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTQ1NjA4Nzc4ZDBmNGM1NGFlMTIyYjgyNDhmYzlkMDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTM2NjY5LC00NC4wMDE5ODQ2Njc2MDQyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OTQyNTMyOWM5Mjk0MzIxOWVmMzA0NzFhMDBiNTM5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMDJkYzUwZTIwMmE0NmZmYmFkYmZlNzZmMTkxMjUzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTAyZGM1MGUyMDJhNDZmZmJhZGJmZTc2ZjE5MTI1M2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZJTEEgT0VTVEUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OTQyNTMyOWM5Mjk0MzIxOWVmMzA0NzFhMDBiNTM5Ni5zZXRDb250ZW50KGh0bWxfZTAyZGM1MGUyMDJhNDZmZmJhZGJmZTc2ZjE5MTI1M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTQ1NjA4Nzc4ZDBmNGM1NGFlMTIyYjgyNDhmYzlkMDUuYmluZFBvcHVwKHBvcHVwXzQ5NDI1MzI5YzkyOTQzMjE5ZWYzMDQ3MWEwMGI1Mzk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4ZTNmMWMzNmMzYjRiMTBhMTMyNDU4NjJmNzdkMGJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk0NDk0MTI1LC00NC4wMjA4MTY0NDA2OTAzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOTk2ODBjNzljZmQ0YmRjOTliNDJiYTk5MWQ0ODkyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYjNmMjkzODRhMWQ0N2NiODllMzMwMjYyNzU0YWRjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWIzZjI5Mzg0YTFkNDdjYjg5ZTMzMDI2Mjc1NGFkY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZJTEEgVklSR0lOSUEgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOTk2ODBjNzljZmQ0YmRjOTliNDJiYTk5MWQ0ODkyNi5zZXRDb250ZW50KGh0bWxfZWIzZjI5Mzg0YTFkNDdjYjg5ZTMzMDI2Mjc1NGFkY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDhlM2YxYzM2YzNiNGIxMGExMzI0NTg2MmY3N2QwYmEuYmluZFBvcHVwKHBvcHVwX2U5OTY4MGM3OWNmZDRiZGM5OWI0MmJhOTkxZDQ4OTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyZTkyZmRjNzkzNzQwYTFhZWYyNzhjYWYxZGQ1ZDBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk1NTAwNTUsLTQzLjk5OTAyMTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjJhY2U1MWYxZjdkNDBiNTg5N2I1NjVmZWU2ZTc2MTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTA5MDk2OTBlODg4NGQyOWE3ZjkwOGNjZDEzMDNlOTkgPSAkKCc8ZGl2IGlkPSJodG1sX2UwOTA5NjkwZTg4ODRkMjlhN2Y5MDhjY2QxMzAzZTk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WSVNUQSBBTEVHUkUgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMmFjZTUxZjFmN2Q0MGI1ODk3YjU2NWZlZTZlNzYxNy5zZXRDb250ZW50KGh0bWxfZTA5MDk2OTBlODg4NGQyOWE3ZjkwOGNjZDEzMDNlOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzJlOTJmZGM3OTM3NDBhMWFlZjI3OGNhZjFkZDVkMGQuYmluZFBvcHVwKHBvcHVwX2IyYWNlNTFmMWY3ZDQwYjU4OTdiNTY1ZmVlNmU3NjE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4OWFiMDBhOTQ0MTRlNDFhMjE4MzJkMWVlZWFiOTYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk4OTUzNjQsLTQ0LjA1OTM3NzM5OTk5OTk5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOGRjMDBmZGJmNzg0ZDJiOGYzZWNmNzE5M2Y5YmQ5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjlmNzQ3NGNmOWE0Yjg2OGJmMDc0MWYxNzMzZTg4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2I5Zjc0NzRjZjlhNGI4NjhiZjA3NDFmMTczM2U4ODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBU0hJTkdUT04gUElSRVMgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOGRjMDBmZGJmNzg0ZDJiOGYzZWNmNzE5M2Y5YmQ5NS5zZXRDb250ZW50KGh0bWxfN2I5Zjc0NzRjZjlhNGI4NjhiZjA3NDFmMTczM2U4ODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzg5YWIwMGE5NDQxNGU0MWEyMTgzMmQxZWVlYWI5NjAuYmluZFBvcHVwKHBvcHVwXzE4ZGMwMGZkYmY3ODRkMmI4ZjNlY2Y3MTkzZjliZDk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkZWYxZjdmOTgwMjRkMGM5Y2RiYjMzMDAxNDEwMTcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg0MDE0MjMsLTQ0LjAxOTMzNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2Q0Yzg4NDA3NDJjNGI0ZTk0ODExYTQ0YjRjMmMxYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWRhMzcwN2FmZjJkNDM0ZWI0YzgzYmI3ZjkwYjE2NmEgPSAkKCc8ZGl2IGlkPSJodG1sX2VkYTM3MDdhZmYyZDQzNGViNGM4M2JiN2Y5MGIxNjZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5YQU5HUklMQSBDbGFzcyBsb3c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkNGM4ODQwNzQyYzRiNGU5NDgxMWE0NGI0YzJjMWE4LnNldENvbnRlbnQoaHRtbF9lZGEzNzA3YWZmMmQ0MzRlYjRjODNiYjdmOTBiMTY2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZGVmMWY3Zjk4MDI0ZDBjOWNkYmIzMzAwMTQxMDE3Mi5iaW5kUG9wdXAocG9wdXBfY2Q0Yzg4NDA3NDJjNGI0ZTk0ODExYTQ0YjRjMmMxYTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWVlYWRlN2NmMjBhNDE4NzlkMGFhMzlmMmFhY2UyOTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstNy4zNzEwNzUsLTY0Ljc1MzAyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOWFjY2IyYjhmMTA0NGU0YTI3OTkzZmQ3ZGNiODczMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDYxYjlmYjFkYjc0ODhjODA5ZmVmNDViYTBkODIzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQ2MWI5ZmIxZGI3NDg4YzgwOWZlZjQ1YmEwZDgyM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlpPTkEgUlVSQUwgQ2xhc3MgbG93PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOWFjY2IyYjhmMTA0NGU0YTI3OTkzZmQ3ZGNiODczMC5zZXRDb250ZW50KGh0bWxfMGQ2MWI5ZmIxZGI3NDg4YzgwOWZlZjQ1YmEwZDgyM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWVlYWRlN2NmMjBhNDE4NzlkMGFhMzlmMmFhY2UyOTAuYmluZFBvcHVwKHBvcHVwX2Q5YWNjYjJiOGYxMDQ0ZTRhMjc5OTNmZDdkY2I4NzMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4ZWJiZGM0NWIzOTRmNjFhNTE0NWUxMTMzYTk3MThjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5MjI2MDY5OTk5OTk5OCwtNDQuMDAzNDU4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Y2QyMjE5ZGFiZWI0ODQ1OGNmMjA5MmRmMDBiZjUwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjdmNzg5ZjhlYmM0YTU5YjdjZGIxN2M4OTIyMDBkYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTI3Zjc4OWY4ZWJjNGE1OWI3Y2RiMTdjODkyMjAwZGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFMSVBJTyBERSBNRUxPIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjZDIyMTlkYWJlYjQ4NDU4Y2YyMDkyZGYwMGJmNTBhLnNldENvbnRlbnQoaHRtbF85MjdmNzg5ZjhlYmM0YTU5YjdjZGIxN2M4OTIyMDBkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOGViYmRjNDViMzk0ZjYxYTUxNDVlMTEzM2E5NzE4Yy5iaW5kUG9wdXAocG9wdXBfN2NkMjIxOWRhYmViNDg0NThjZjIwOTJkZjAwYmY1MGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDZmMGJkN2RlN2MxNGUyMmExOWRmNjUyN2M1YmEyZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODQ2NjYyNjAwMDAwMDAyLC00NC4wMDY4MDYyOTk5OTk5OTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDIwZTBmMDY0MDQ1NGQ5ZjlhNDNmYjU2Mjg2ZmM5ODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRlMzZlMTU2ZmIwNDJkZDg1ZWQyNDI3MTI0ODM4ZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzlkZTM2ZTE1NmZiMDQyZGQ4NWVkMjQyNzEyNDgzOGY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CUkFVTkFTIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyMGUwZjA2NDA0NTRkOWY5YTQzZmI1NjI4NmZjOTgwLnNldENvbnRlbnQoaHRtbF85ZGUzNmUxNTZmYjA0MmRkODVlZDI0MjcxMjQ4MzhmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNmYwYmQ3ZGU3YzE0ZTIyYTE5ZGY2NTI3YzViYTJmOC5iaW5kUG9wdXAocG9wdXBfZDIwZTBmMDY0MDQ1NGQ5ZjlhNDNmYjU2Mjg2ZmM5ODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWEzODgyMjBiY2QzNDI2ZGJmOTQ3YTA5OTNhM2EwMWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODk5NzAwNTUsLTQzLjk2NTI1NTU4NTg5NjE2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kODdkNzZkNTQ0N2M0MzZiOGNhZjhiMTU5ZDEwODk3ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MDEyODVmNjlkYjI0Y2RlYmFmMzZlYTkxMjZjYzVlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTAxMjg1ZjY5ZGIyNGNkZWJhZjM2ZWE5MTI2Y2M1ZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNBSUNBUkEgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDg3ZDc2ZDU0NDdjNDM2YjhjYWY4YjE1OWQxMDg5N2Quc2V0Q29udGVudChodG1sXzUwMTI4NWY2OWRiMjRjZGViYWYzNmVhOTEyNmNjNWVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlhMzg4MjIwYmNkMzQyNmRiZjk0N2EwOTkzYTNhMDFhLmJpbmRQb3B1cChwb3B1cF9kODdkNzZkNTQ0N2M0MzZiOGNhZjhiMTU5ZDEwODk3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81Mzk4OWRmMmY3ZjM0ZWEwOWViMWQzNzFjYzVkNjU3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MDUxMzM2MDAwMDAwMDMsLTQzLjk3NDk4NzIyMDEwNTk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWZhYTRlZDVlNDg0ZmU5YTg0Y2Y2Zjg2MDI3NzY2YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOGQwNmZlMTA0YjA0YWVjYmZlNjA0MWY3NTY0YzI5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDhkMDZmZTEwNGIwNGFlY2JmZTYwNDFmNzU2NGMyOWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNBSUNBUkEgQURFTEFJREUgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGVmYWE0ZWQ1ZTQ4NGZlOWE4NGNmNmY4NjAyNzc2NmMuc2V0Q29udGVudChodG1sX2Q4ZDA2ZmUxMDRiMDRhZWNiZmU2MDQxZjc1NjRjMjlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUzOTg5ZGYyZjdmMzRlYTA5ZWIxZDM3MWNjNWQ2NTdkLmJpbmRQb3B1cChwb3B1cF9kZWZhYTRlZDVlNDg0ZmU5YTg0Y2Y2Zjg2MDI3NzY2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjYwMjAwOTc1NmQ0NDJjYjJkN2IyODI2NDVjMmQ0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MjQzNjExNSwtNDMuOTcwMDU0NDAzMzQ1NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmYyZGMwNmViMzJmNDExODg4M2I1YjZmMzkyYWUxOWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGI2NTI3ZmQ0ZTM2NGE5ZDhjZWVkZDA4NmVkNWQyYWIgPSAkKCc8ZGl2IGlkPSJodG1sXzRiNjUyN2ZkNGUzNjRhOWQ4Y2VlZGQwODZlZDVkMmFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DQUxBRkFURSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjJkYzA2ZWIzMmY0MTE4ODgzYjViNmYzOTJhZTE5Zi5zZXRDb250ZW50KGh0bWxfNGI2NTI3ZmQ0ZTM2NGE5ZDhjZWVkZDA4NmVkNWQyYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmI2MDIwMDk3NTZkNDQyY2IyZDdiMjgyNjQ1YzJkNDcuYmluZFBvcHVwKHBvcHVwX2JmMmRjMDZlYjMyZjQxMTg4ODNiNWI2ZjM5MmFlMTlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkOGNhNzNmNTFhNDRjOTJiMDFmZDI5MWNmZDdjOGE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkxMzU1MDk1LC00My45NjU3NDc0MzE5NDg4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTFhZDRiNzg3YWY0MDQyYjQyNTU0YjdhNmVjNDVmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNDlhM2Q0YzgxODU0M2Q4OTAwMDNkY2Q0Zjk4Zjk3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTQ5YTNkNGM4MTg1NDNkODkwMDAzZGNkNGY5OGY5NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNBUkxPUyBQUkFURVMgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjUxYWQ0Yjc4N2FmNDA0MmI0MjU1NGI3YTZlYzQ1ZjIuc2V0Q29udGVudChodG1sX2U0OWEzZDRjODE4NTQzZDg5MDAwM2RjZDRmOThmOTcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJkOGNhNzNmNTFhNDRjOTJiMDFmZDI5MWNmZDdjOGE0LmJpbmRQb3B1cChwb3B1cF9iNTFhZDRiNzg3YWY0MDQyYjQyNTU0YjdhNmVjNDVmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTMzZGI2ZDljZDg0MzE3ODhlZTA1ZTBhZWY0OWVlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MTkxMDI2MDAwMDAwMDIsLTQ0LjAxMTA1MzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGYwY2JhZGUxOWRmNDE0NzljNGFmYmMzYWQ0NWMyZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY1NmI5YjQ3NDI1NGRmMDhhMzgwZjgyODY2OTEwOTEgPSAkKCc8ZGl2IGlkPSJodG1sXzk2NTZiOWI0NzQyNTRkZjA4YTM4MGY4Mjg2NjkxMDkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DT05KVU5UTyBDQUxJRk9STklBIElJIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmMGNiYWRlMTlkZjQxNDc5YzRhZmJjM2FkNDVjMmU1LnNldENvbnRlbnQoaHRtbF85NjU2YjliNDc0MjU0ZGYwOGEzODBmODI4NjY5MTA5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZTMzZGI2ZDljZDg0MzE3ODhlZTA1ZTBhZWY0OWVlNS5iaW5kUG9wdXAocG9wdXBfNGYwY2JhZGUxOWRmNDE0NzljNGFmYmMzYWQ0NWMyZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmI3Mjc4YTgxZDUxNDQwODg2NWEwYmY1ZWFhNDM3NDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODg1NzQwMSwtNDQuMDA4NTE0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzRhM2RhNmExMjc0NGE2YjM2OTJkNzFiNmIzNTFjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Yjg2NTNhN2YxNWQ0M2Y0YTEwY2IyZjUwZWViODExYyA9ICQoJzxkaXYgaWQ9Imh0bWxfOWI4NjUzYTdmMTVkNDNmNGExMGNiMmY1MGVlYjgxMWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNPTkpVTlRPIENFTFNPIE1BQ0hBRE8gQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmM0YTNkYTZhMTI3NDRhNmIzNjkyZDcxYjZiMzUxYzAuc2V0Q29udGVudChodG1sXzliODY1M2E3ZjE1ZDQzZjRhMTBjYjJmNTBlZWI4MTFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiNzI3OGE4MWQ1MTQ0MDg4NjVhMGJmNWVhYTQzNzQwLmJpbmRQb3B1cChwb3B1cF82YzRhM2RhNmExMjc0NGE2YjM2OTJkNzFiNmIzNTFjMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZDFkMzUyZmNhZTU0ZTNmYjRkZGNmZjdhM2FjZDMxZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MjIwMjMwNSwtNDMuOTk4MTUxNjYzNjc4NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc2NmQ4NDhhOGZlNDc0Y2FkMjEyOTAyNDI4Yzc5MjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWM4MDc2YTU5OTAyNDdiMDlkZDVjY2ZiN2MyYmVjNmMgPSAkKCc8ZGl2IGlkPSJodG1sXzFjODA3NmE1OTkwMjQ3YjA5ZGQ1Y2NmYjdjMmJlYzZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ET00gQ0FCUkFMIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3NjZkODQ4YThmZTQ3NGNhZDIxMjkwMjQyOGM3OTI5LnNldENvbnRlbnQoaHRtbF8xYzgwNzZhNTk5MDI0N2IwOWRkNWNjZmI3YzJiZWM2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZDFkMzUyZmNhZTU0ZTNmYjRkZGNmZjdhM2FjZDMxZS5iaW5kUG9wdXAocG9wdXBfNDc2NmQ4NDhhOGZlNDc0Y2FkMjEyOTAyNDI4Yzc5MjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmMxNDRmYTZiODc3NDdkZmJiN2Y3YWU5ZjFiMzQyNDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTA1NDk5MiwtNDMuOTA0MjY3NzcyODE0NTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzY3ZTA4MDQ4ZWQ2NDY3NWE1YzFmZWUzZGE0MzU5MzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQzYWU1NmZhMGQxNDQ3NDkwMzEzMGFhZjA5OTNkNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzJkM2FlNTZmYTBkMTQ0NzQ5MDMxMzBhYWYwOTkzZDcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FU1BMQU5BREEgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzY3ZTA4MDQ4ZWQ2NDY3NWE1YzFmZWUzZGE0MzU5Mzcuc2V0Q29udGVudChodG1sXzJkM2FlNTZmYTBkMTQ0NzQ5MDMxMzBhYWYwOTkzZDcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZjMTQ0ZmE2Yjg3NzQ3ZGZiYjdmN2FlOWYxYjM0MjQzLmJpbmRQb3B1cChwb3B1cF8zNjdlMDgwNDhlZDY0Njc1YTVjMWZlZTNkYTQzNTkzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NmUxNzViODlmODA0N2RhYjU2NzMyYWJhZjdiNGQxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MzY0ODY2LC00My45OTc5OTUyMDAwMDAwMDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc0NWUzODlkNmFmNDI0MTliZjc3NTZmNDhmMjZhNzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmMwNzk2MTRjNmZkNDI2MWExY2Q4OGE4MzA2NTRmMzIgPSAkKCc8ZGl2IGlkPSJodG1sXzZjMDc5NjE0YzZmZDQyNjFhMWNkODhhODMwNjU0ZjMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HQVJDQVMgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDc0NWUzODlkNmFmNDI0MTliZjc3NTZmNDhmMjZhNzUuc2V0Q29udGVudChodG1sXzZjMDc5NjE0YzZmZDQyNjFhMWNkODhhODMwNjU0ZjMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ2ZTE3NWI4OWY4MDQ3ZGFiNTY3MzJhYmFmN2I0ZDFhLmJpbmRQb3B1cChwb3B1cF80NzQ1ZTM4OWQ2YWY0MjQxOWJmNzc1NmY0OGYyNmE3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWQ5Mjk5NGMzZDY0MTc4OWExZDE2NjU4YjIyN2YwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MDk2MDUzMDAwMDAwMDYsLTQzLjkxNzUwOTc3Mzc0MzE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5OTI1Yjc0YWUzOTRhNzI5MjcxYWMzM2Q4ZjNiNjU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY3YjdhMGNiMTUyYTQyZWZhNjJkNmI4ZGIxYzAzMjE2ID0gJCgnPGRpdiBpZD0iaHRtbF82N2I3YTBjYjE1MmE0MmVmYTYyZDZiOGRiMWMwMzIxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SE9SVE8gQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDk5MjViNzRhZTM5NGE3MjkyNzFhYzMzZDhmM2I2NTkuc2V0Q29udGVudChodG1sXzY3YjdhMGNiMTUyYTQyZWZhNjJkNmI4ZGIxYzAzMjE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlZDkyOTk0YzNkNjQxNzg5YTFkMTY2NThiMjI3ZjA2LmJpbmRQb3B1cChwb3B1cF80OTkyNWI3NGFlMzk0YTcyOTI3MWFjMzNkOGYzYjY1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NjBkMDliYzY4Y2I0NTNjYTNlYzgwYjM5ZDhiNjUyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDcwNDAyLC00My45NzE4MjI4MDExODY1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNzNlYjYwMTNjMGE0YWMxYjk3NTFmZGJmMWY2NDM3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYTA5MzIzZTVkYjA0MDlmODNkNDg2OWFiNWIyNTMwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWEwOTMyM2U1ZGIwNDA5ZjgzZDQ4NjlhYjViMjUzMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkpBUkRJTSBBTUVSSUNBIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3M2ViNjAxM2MwYTRhYzFiOTc1MWZkYmYxZjY0MzczLnNldENvbnRlbnQoaHRtbF8xYTA5MzIzZTVkYjA0MDlmODNkNDg2OWFiNWIyNTMwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NjBkMDliYzY4Y2I0NTNjYTNlYzgwYjM5ZDhiNjUyZi5iaW5kUG9wdXAocG9wdXBfMTczZWI2MDEzYzBhNGFjMWI5NzUxZmRiZjFmNjQzNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWFjZDZmMDkyMjRiNGVhZjhhOWZlMDg5ZDA1ZWJjNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTI5MjQ1LC00My45OTk2ODg3MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMWUxM2RiMTc1YTM0MWU4OTQ1ODU0YTExMWM1NGRiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZjU3YjIwMjdhNTY0YTUxOTY0OTYzMGRhOWM4NjBkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWY1N2IyMDI3YTU2NGE1MTk2NDk2MzBkYTljODYwZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkpPQU8gUElOSEVJUk8gQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjFlMTNkYjE3NWEzNDFlODk0NTg1NGExMTFjNTRkYjQuc2V0Q29udGVudChodG1sXzFmNTdiMjAyN2E1NjRhNTE5NjQ5NjMwZGE5Yzg2MGQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlhY2Q2ZjA5MjI0YjRlYWY4YTlmZTA4OWQwNWViYzU3LmJpbmRQb3B1cChwb3B1cF8yMWUxM2RiMTc1YTM0MWU4OTQ1ODU0YTExMWM1NGRiNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YjhjNDYyMzc4MTc0MjJjOGNkNjYzMGMzYzI1NDk4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MDY0MTQyLC00My45OTQ1NzUzNjc4NjgzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82N2EyMzk3YWQ2OGE0MmIwOGRkMGUyNTZjZGQ0ZDk5ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzFlZjViNTM0OWM0NWE4YTVjMzhiZGU1NjE5ZDc2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWMxZWY1YjUzNDljNDVhOGE1YzM4YmRlNTYxOWQ3NjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBR09JTkhBIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3YTIzOTdhZDY4YTQyYjA4ZGQwZTI1NmNkZDRkOTllLnNldENvbnRlbnQoaHRtbF9hYzFlZjViNTM0OWM0NWE4YTVjMzhiZGU1NjE5ZDc2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YjhjNDYyMzc4MTc0MjJjOGNkNjYzMGMzYzI1NDk4Zi5iaW5kUG9wdXAocG9wdXBfNjdhMjM5N2FkNjhhNDJiMDhkZDBlMjU2Y2RkNGQ5OWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGMwMWMwNjBlODVkNDJhY2FlYTMyZWYwMzhjYjVmYTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTE3NTMwMDUsLTQzLjk5MDA1NDYxOTg3NjIyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85M2FiZDNkOWRlOWQ0ZmE4YmM0MjNjMjczYmZhY2FlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmJjMjdiZDc4ZWI0M2MxYmYwYzk0Yjk0MTI5MGY2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJiYzI3YmQ3OGViNDNjMWJmMGM5NGI5NDEyOTBmNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JTkFTIEJSQVNJTCBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85M2FiZDNkOWRlOWQ0ZmE4YmM0MjNjMjczYmZhY2FlMi5zZXRDb250ZW50KGh0bWxfZGJiYzI3YmQ3OGViNDNjMWJmMGM5NGI5NDEyOTBmNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGMwMWMwNjBlODVkNDJhY2FlYTMyZWYwMzhjYjVmYTAuYmluZFBvcHVwKHBvcHVwXzkzYWJkM2Q5ZGU5ZDRmYThiYzQyM2MyNzNiZmFjYWUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0ODlkNWNkNzg3MTQzZDc4YjliOTE0MmNiZmYxN2FlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkwOTI3NjQ1LC00My45Nzc5MjgwNzkwMzI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84M2E2NDJlZmJkNGE0MjQzYmY3ODNjMGFhOTc0NWMzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZTUwM2ExNzBjNTQ0NmJiOWNlYTczZDBmN2ZkMzFmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGU1MDNhMTcwYzU0NDZiYjljZWE3M2QwZjdmZDMxZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1PTlNFTkhPUiBNRVNTSUFTIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgzYTY0MmVmYmQ0YTQyNDNiZjc4M2MwYWE5NzQ1YzMyLnNldENvbnRlbnQoaHRtbF84ZTUwM2ExNzBjNTQ0NmJiOWNlYTczZDBmN2ZkMzFmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NDg5ZDVjZDc4NzE0M2Q3OGI5YjkxNDJjYmZmMTdhZS5iaW5kUG9wdXAocG9wdXBfODNhNjQyZWZiZDRhNDI0M2JmNzgzYzBhYTk3NDVjMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzRkOWE3ZTQ4OGQ0NDNiOTlhYWY1NzQzNTdmNDUyMTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODkzMDEzOSwtNDMuOTM0MTM2NzMxNDU2NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU4ZjMyZjIxNzY3NDJkNmE2ODViNGJkOGU3MjU2ZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2E2N2NjZTQ2OTZhNDhjN2FmNjIyODQxOWNkM2NmYjcgPSAkKCc8ZGl2IGlkPSJodG1sXzdhNjdjY2U0Njk2YTQ4YzdhZjYyMjg0MTljZDNjZmI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT1ZBIEZMT1JFU1RBIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlOGYzMmYyMTc2NzQyZDZhNjg1YjRiZDhlNzI1NmYxLnNldENvbnRlbnQoaHRtbF83YTY3Y2NlNDY5NmE0OGM3YWY2MjI4NDE5Y2QzY2ZiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NGQ5YTdlNDg4ZDQ0M2I5OWFhZjU3NDM1N2Y0NTIxOC5iaW5kUG9wdXAocG9wdXBfMWU4ZjMyZjIxNzY3NDJkNmE2ODViNGJkOGU3MjU2ZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmU2NTE4MjQzNGVlNGZkNWExMTZiM2JmNTM3MjYxZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQxNTUyNCwtNDMuOTY4NTM1OTE3NTI4NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTcxYjM1N2I4NDhjNDYzOTliZmJiZTc1MGQ5MmRhNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWIyMmQ1YTRiODcyNDNjN2EwYjA3ZWNjOTE5ZWE4MmYgPSAkKCc8ZGl2IGlkPSJodG1sX2ViMjJkNWE0Yjg3MjQzYzdhMGIwN2VjYzkxOWVhODJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT1ZBIEdSQU5BREEgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTcxYjM1N2I4NDhjNDYzOTliZmJiZTc1MGQ5MmRhNGIuc2V0Q29udGVudChodG1sX2ViMjJkNWE0Yjg3MjQzYzdhMGIwN2VjYzkxOWVhODJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlNjUxODI0MzRlZTRmZDVhMTE2YjNiZjUzNzI2MWQ0LmJpbmRQb3B1cChwb3B1cF81NzFiMzU3Yjg0OGM0NjM5OWJmYmJlNzUwZDkyZGE0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMzA5ZjU5NGYyNmM0MmIyODdlNTI4ZjQ3YTI3ODllMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MzM1MDEzNSwtNDMuOTc3MjUzNDc1NzAxMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ3ZDcyYzc4OGJmNDMzOTg2NTM2ZjNiZTg3NjhiYTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDM2OTA1MTExMTdhNDU2YmE0OGY0NjdmZjgzMjVlZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzQzNjkwNTExMTE3YTQ1NmJhNDhmNDY3ZmY4MzI1ZWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT1ZBIFNVSUNBIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0N2Q3MmM3ODhiZjQzMzk4NjUzNmYzYmU4NzY4YmE5LnNldENvbnRlbnQoaHRtbF80MzY5MDUxMTExN2E0NTZiYTQ4ZjQ2N2ZmODMyNWVmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMzA5ZjU5NGYyNmM0MmIyODdlNTI4ZjQ3YTI3ODllMy5iaW5kUG9wdXAocG9wdXBfZTQ3ZDcyYzc4OGJmNDMzOTg2NTM2ZjNiZTg3NjhiYTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzgwMWEwNTcyYjI3NDM4ZjgxN2EwOTRkOTE0NzhlNDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTE0MzA0NSwtNDMuOTc5MzU1OTkwMTM3NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzYwZjQ4NmZmZWM0NGM2NzlmY2YxNTkyNWRiNGY5ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODkyNjhiYjQ0M2EyNDFmNTkzNjFmZGJjMTUyNzEwZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzg5MjY4YmI0NDNhMjQxZjU5MzYxZmRiYzE1MjcxMGQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QQURSRSBFVVNUQVFVSU8gQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzYwZjQ4NmZmZWM0NGM2NzlmY2YxNTkyNWRiNGY5ZmYuc2V0Q29udGVudChodG1sXzg5MjY4YmI0NDNhMjQxZjU5MzYxZmRiYzE1MjcxMGQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc4MDFhMDU3MmIyNzQzOGY4MTdhMDk0ZDkxNDc4ZTQ0LmJpbmRQb3B1cChwb3B1cF8zNjBmNDg2ZmZlYzQ0YzY3OWZjZjE1OTI1ZGI0ZjlmZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNTM5ZDQxNTgzNmM0Njk0YmFjODQ5MGU3YzJmNTlkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzMxNjQyLC00My45MzM4MDc1MjQ2MjQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiY2RlMGY1NGZhMDQ3Njg5MTM2ZDY2Mjk3MzBkZjA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5MDg2Yzc5N2IyNjQ3ZWZiMDI4Zjc2NTViNTBlYzgyID0gJCgnPGRpdiBpZD0iaHRtbF9mOTA4NmM3OTdiMjY0N2VmYjAyOGY3NjU1YjUwZWM4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UEFMTUFSRVMgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmJjZGUwZjU0ZmEwNDc2ODkxMzZkNjYyOTczMGRmMDkuc2V0Q29udGVudChodG1sX2Y5MDg2Yzc5N2IyNjQ3ZWZiMDI4Zjc2NTViNTBlYzgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y1MzlkNDE1ODM2YzQ2OTRiYWM4NDkwZTdjMmY1OWQxLmJpbmRQb3B1cChwb3B1cF9iYmNkZTBmNTRmYTA0NzY4OTEzNmQ2NjI5NzMwZGYwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZmQzYzYwODVmMDE0ZTk2YTMzNjRhMjYzYmFmMWIzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NzAyMjE1LC00My45OTMxMzY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxNjAwZTFhZGIxOTRjYWVhMzMyNWY3OWZkNTEzYWFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2MjdjMjA4ZjAzNjQxZmM4ZjVlYmI2YzhlZTZlZjY5ID0gJCgnPGRpdiBpZD0iaHRtbF82NjI3YzIwOGYwMzY0MWZjOGY1ZWJiNmM4ZWU2ZWY2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UEFRVUVUQSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MTYwMGUxYWRiMTk0Y2FlYTMzMjVmNzlmZDUxM2FhYy5zZXRDb250ZW50KGh0bWxfNjYyN2MyMDhmMDM2NDFmYzhmNWViYjZjOGVlNmVmNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmZkM2M2MDg1ZjAxNGU5NmEzMzY0YTI2M2JhZjFiMzEuYmluZFBvcHVwKHBvcHVwXzcxNjAwZTFhZGIxOTRjYWVhMzMyNWY3OWZkNTEzYWFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4NzI1NjBiNWI2OTRlYTRhZGJiZDE3N2NiMzhmYzY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTIyLjQ5MjQwNzIsLTQ3LjgzMDY5NTM5OTk5OTk5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wN2JkMjk2OTNjZWU0MzJkYTRhMjU4NDM4MmM1YTgyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZjFlZDY5M2ZlMTQ0Mzk4OGMyMzVhMDBmNjY0ZGM2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWYxZWQ2OTNmZTE0NDM5ODhjMjM1YTAwZjY2NGRjNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBFRFJPIElJIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3YmQyOTY5M2NlZTQzMmRhNGEyNTg0MzgyYzVhODIyLnNldENvbnRlbnQoaHRtbF9lZjFlZDY5M2ZlMTQ0Mzk4OGMyMzVhMDBmNjY0ZGM2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ODcyNTYwYjViNjk0ZWE0YWRiYmQxNzdjYjM4ZmM2OC5iaW5kUG9wdXAocG9wdXBfMDdiZDI5NjkzY2VlNDMyZGE0YTI1ODQzODJjNWE4MjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk4OTc1NzE2OTI4NDBkMmFlODcxZDJmMzk1MDMxNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODMzMjYzNzUsLTQzLjk1MjU4NjE4NTE2MDQzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjMTMxZWJmZWViNTRkNDZiYzUwM2JmMzAwMWI0MDYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlZDA3N2VkN2U1YjQyOWU4OWRlNzQ1ZTJjNjUxMDQyID0gJCgnPGRpdiBpZD0iaHRtbF8zZWQwNzdlZDdlNWI0MjllODlkZTc0NWUyYzY1MTA0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UExBTkFMVE8gQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmMxMzFlYmZlZWI1NGQ0NmJjNTAzYmYzMDAxYjQwNjIuc2V0Q29udGVudChodG1sXzNlZDA3N2VkN2U1YjQyOWU4OWRlNzQ1ZTJjNjUxMDQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5ODk3NTcxNjkyODQwZDJhZTg3MWQyZjM5NTAzMTQ3LmJpbmRQb3B1cChwb3B1cF8yYzEzMWViZmVlYjU0ZDQ2YmM1MDNiZjMwMDFiNDA2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYTRhZDgxMGQyYzM0Y2IwODU3NDkxYWU1MzAyMmQwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTEyOTk1LC00My45NDE3MTMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwZGZmNTIwYjUzYzRiZjI5NmM3NWMxZWVjNTFlMWMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiMDFjYTBmMmUyNzRmNzU5OGQ2NzY2MmQ1ODcxZTlmID0gJCgnPGRpdiBpZD0iaHRtbF9jYjAxY2EwZjJlMjc0Zjc1OThkNjc2NjJkNTg3MWU5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UkVOQVNDRU5DQSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMGRmZjUyMGI1M2M0YmYyOTZjNzVjMWVlYzUxZTFjMS5zZXRDb250ZW50KGh0bWxfY2IwMWNhMGYyZTI3NGY3NTk4ZDY3NjYyZDU4NzFlOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWE0YWQ4MTBkMmMzNGNiMDg1NzQ5MWFlNTMwMjJkMDYuYmluZFBvcHVwKHBvcHVwXzEwZGZmNTIwYjUzYzRiZjI5NmM3NWMxZWVjNTFlMWMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk5M2IwN2ZhZjc5ZTQwOTY5MzQzZjMzMWMzMmJiNTFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkwMDMzMjEwMDAwMDAwNCwtNDMuOTIzNzIyNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzQ5MjlkYTM1OTg4NDMzMjk0ZTFhNjMyNWQ2NGNhYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWI5NTExOGU4Zjg1NGY2M2FkMjM1M2U1YjAzOGRmMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzliOTUxMThlOGY4NTRmNjNhZDIzNTNlNWIwMzhkZjAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQUdSQURBIEZBTUlMSUEgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzQ5MjlkYTM1OTg4NDMzMjk0ZTFhNjMyNWQ2NGNhYjIuc2V0Q29udGVudChodG1sXzliOTUxMThlOGY4NTRmNjNhZDIzNTNlNWIwMzhkZjAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5M2IwN2ZhZjc5ZTQwOTY5MzQzZjMzMWMzMmJiNTFjLmJpbmRQb3B1cChwb3B1cF8zNDkyOWRhMzU5ODg0MzMyOTRlMWE2MzI1ZDY0Y2FiMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDIwNDNlNTlkN2Q0OTRjYWYzZGRjODczNjUyNGEzNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MjM3Njg2NSwtNDMuOTIxMjQ1ODI1NDM4MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGY4ZDZiM2Q2MzZlNDA1ZGI5YWM0ZDgwMzYyNWJkNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjk1YTVjYTVmM2RkNDBkYWFlZGNkM2VlZTMyZGVkOTIgPSAkKCc8ZGl2IGlkPSJodG1sXzI5NWE1Y2E1ZjNkZDQwZGFhZWRjZDNlZWUzMmRlZDkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQU5UQSBFRklHRU5JQSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjhkNmIzZDYzNmU0MDVkYjlhYzRkODAzNjI1YmQ2OS5zZXRDb250ZW50KGh0bWxfMjk1YTVjYTVmM2RkNDBkYWFlZGNkM2VlZTMyZGVkOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTAyMDQzZTU5ZDdkNDk0Y2FmM2RkYzg3MzY1MjRhMzYuYmluZFBvcHVwKHBvcHVwXzBmOGQ2YjNkNjM2ZTQwNWRiOWFjNGQ4MDM2MjViZDY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0ZDc2MTI1YmI4OTRlNmZiZmE2OTUxODM5NThlMGEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5MDMzMTEsLTQzLjkwOTY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzhmNzUwN2IwZDdiNDcxMTliMTVhZTE3MDk0NGZjODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzEzOWIxNzY0MDkzNGMyYmFmZGJlZDNhYjg4OGY2NGUgPSAkKCc8ZGl2IGlkPSJodG1sXzcxMzliMTc2NDA5MzRjMmJhZmRiZWQzYWI4ODhmNjRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQU5UQSBJTkVTIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4Zjc1MDdiMGQ3YjQ3MTE5YjE1YWUxNzA5NDRmYzg3LnNldENvbnRlbnQoaHRtbF83MTM5YjE3NjQwOTM0YzJiYWZkYmVkM2FiODg4ZjY0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNGQ3NjEyNWJiODk0ZTZmYmZhNjk1MTgzOTU4ZTBhMC5iaW5kUG9wdXAocG9wdXBfYzhmNzUwN2IwZDdiNDcxMTliMTVhZTE3MDk0NGZjODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQyYzE0MTM3YjU2NDRkN2IzYWE4NjVmYTgyYzMwZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODkxNzk0NCwtNDMuOTI5OTEzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNjYyODEzMDM1NTM0ZGM4YTQxM2RlNTM3NTdlM2U2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYjFjYWI2ZjA4Yzg0YWU5YTgwNWQwM2IwMjRlZTg4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWIxY2FiNmYwOGM4NGFlOWE4MDVkMDNiMDI0ZWU4ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNJTFZFSVJBIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2NjI4MTMwMzU1MzRkYzhhNDEzZGU1Mzc1N2UzZTY2LnNldENvbnRlbnQoaHRtbF9lYjFjYWI2ZjA4Yzg0YWU5YTgwNWQwM2IwMjRlZTg4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZDJjMTQxMzdiNTY0NGQ3YjNhYTg2NWZhODJjMzBkZC5iaW5kUG9wdXAocG9wdXBfMjY2MjgxMzAzNTUzNGRjOGE0MTNkZTUzNzU3ZTNlNjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODMwZjk3ZmZkMTM4NGYxMDhjZmVjNzcyYTg2YzJjN2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODczMzY3MiwtNDMuOTY3NjE1MTI5MDU3MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjMxNzAzMTFlZjZhNGNkNThmY2ZiMzBmMDFkZmE1ZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWFiZTcwOGVkZWU5NDc2ZTliYmJmZDBlNWQ2NjMyM2EgPSAkKCc8ZGl2IGlkPSJodG1sX2FhYmU3MDhlZGVlOTQ3NmU5YmJiZmQwZTVkNjYzMjNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VRk1HIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzMTcwMzExZWY2YTRjZDU4ZmNmYjMwZjAxZGZhNWZhLnNldENvbnRlbnQoaHRtbF9hYWJlNzA4ZWRlZTk0NzZlOWJiYmZkMGU1ZDY2MzIzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzBmOTdmZmQxMzg0ZjEwOGNmZWM3NzJhODZjMmM3ZC5iaW5kUG9wdXAocG9wdXBfMjMxNzAzMTFlZjZhNGNkNThmY2ZiMzBmMDFkZmE1ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE5YjFmMzgzYzM2NGM3NGJkNmZmMmY0MDU0OTExMDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMjAuMDA3Mjc3MjUsLTQ0LjAwNjk1MDUzNjgwODE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxMDc0MTdlOTJkMzQ3ZWY5NjUyYmY0MjI5MzY1OWU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmODc3YzgxN2M1ZjQ2YTk5NjdiYmFmOWM2ZGJjZTk0ID0gJCgnPGRpdiBpZD0iaHRtbF8xZjg3N2M4MTdjNWY0NmE5OTY3YmJhZjljNmRiY2U5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QkFSUkVJUk8gQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzEwNzQxN2U5MmQzNDdlZjk2NTJiZjQyMjkzNjU5ZTQuc2V0Q29udGVudChodG1sXzFmODc3YzgxN2M1ZjQ2YTk5NjdiYmFmOWM2ZGJjZTk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhOWIxZjM4M2MzNjRjNzRiZDZmZjJmNDA1NDkxMTA1LmJpbmRQb3B1cChwb3B1cF9jMTA3NDE3ZTkyZDM0N2VmOTY1MmJmNDIyOTM2NTllNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOTdmZTM3NjJjNGE0ODRjYjYyMzk5MTVkYjhiY2JiYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NTg2MTA5LC00My45OTIyMjUxMjM2NzAwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzNkZTJkMGM2M2Q0NDk2OTQ4ZWFkNDQ0NzhmMGNhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OThhZGJmM2NhYTk0MjM1OTUzZjdjM2U5NTI0NzVmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTk4YWRiZjNjYWE5NDIzNTk1M2Y3YzNlOTUyNDc1ZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJFVEFOSUEgQ2xhc3MgcmVndWxhcjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzMzZGUyZDBjNjNkNDQ5Njk0OGVhZDQ0NDc4ZjBjYTMuc2V0Q29udGVudChodG1sXzk5OGFkYmYzY2FhOTQyMzU5NTNmN2MzZTk1MjQ3NWZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5N2ZlMzc2MmM0YTQ4NGNiNjIzOTkxNWRiOGJjYmJhLmJpbmRQb3B1cChwb3B1cF9jMzNkZTJkMGM2M2Q0NDk2OTQ4ZWFkNDQ0NzhmMGNhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zM2U2ZjI3NmZjNDY0NDk1Yjg0Yzg3MWZiZmI1MThmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44OTk1Mjg3LC00My45MzczOTcyOTMwMzA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDY2NTc3ZjUyZDM0MDRiYmI0M2ZhZTQ1OWQ5MGU3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OTc4ZGFiNzk2ZjI0OWM0ODI2NDAyZjBmZGJmZjE4YyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTk3OGRhYjc5NmYyNDljNDgyNjQwMmYwZmRiZmYxOGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNPTkNPUkRJQSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDY2NTc3ZjUyZDM0MDRiYmI0M2ZhZTQ1OWQ5MGU3NS5zZXRDb250ZW50KGh0bWxfOTk3OGRhYjc5NmYyNDljNDgyNjQwMmYwZmRiZmYxOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzNlNmYyNzZmYzQ2NDQ5NWI4NGM4NzFmYmZiNTE4ZjIuYmluZFBvcHVwKHBvcHVwXzk0NjY1NzdmNTJkMzQwNGJiYjQzZmFlNDU5ZDkwZTc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYjEyMjY0YTU1NTQyNjhiMjliMGM5YzJkZTYxZWMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg5NzkzMDcsLTQzLjkxMzA5MTIwMDAwMDAwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWY1YTIzZGM0MmE0OWMzOTU0NzJhNTJkNGQ4MWM3ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZTJmNGNmNDlkZjg0YWFhOTVlY2JiY2QzMTZlODhlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWUyZjRjZjQ5ZGY4NGFhYTk1ZWNiYmNkMzE2ZTg4ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklOU1RJVFVUTyBBR1JPTk9NSUNPIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhZjVhMjNkYzQyYTQ5YzM5NTQ3MmE1MmQ0ZDgxYzdmLnNldENvbnRlbnQoaHRtbF85ZTJmNGNmNDlkZjg0YWFhOTVlY2JiY2QzMTZlODhlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZmIxMjI2NGE1NTU0MjY4YjI5YjBjOWMyZGU2MWVjMS5iaW5kUG9wdXAocG9wdXBfY2FmNWEyM2RjNDJhNDljMzk1NDcyYTUyZDRkODFjN2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNkZWY2ZjMwMDM3NDIwNWJjNjU5N2NjYmE2YTljMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTEzMTMzNiwtNDMuOTAyODU2OTk1Nzk2MjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjIzYzI3ZDVmOTVkNDkzMmEzMzJiMGNkY2JiZDZjYTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWE4ZjljMmI2ZDMyNDA4MWI1NzRmM2IyZDRhZDM0ZDYgPSAkKCc8ZGl2IGlkPSJodG1sX2VhOGY5YzJiNmQzMjQwODFiNTc0ZjNiMmQ0YWQzNGQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QT01QRUlBIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YyM2MyN2Q1Zjk1ZDQ5MzJhMzMyYjBjZGNiYmQ2Y2E5LnNldENvbnRlbnQoaHRtbF9lYThmOWMyYjZkMzI0MDgxYjU3NGYzYjJkNGFkMzRkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Y2RlZjZmMzAwMzc0MjA1YmM2NTk3Y2NiYTZhOWMzOC5iaW5kUG9wdXAocG9wdXBfZjIzYzI3ZDVmOTVkNDkzMmEzMzJiMGNkY2JiZDZjYTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzgwZjA4MDA1ZTdiNGM1N2EzMTUyODkzMmM5NWM3OWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTM0MzM4NjAwMDAwMDA0LC00NC4wMTI4NTcyMDAwMDAwMDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzIxMzYyMmRiNTAxNDhlMTgyMjM2ODk0ZDM5ODczNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y1MmQ3NjhhZmJmNDliZDk3NDcwMjVhOGQ4Mjg3YzIgPSAkKCc8ZGl2IGlkPSJodG1sX2NmNTJkNzY4YWZiZjQ5YmQ5NzQ3MDI1YThkODI4N2MyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQU5UQSBNQVJJQSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMjEzNjIyZGI1MDE0OGUxODIyMzY4OTRkMzk4NzM0Ny5zZXRDb250ZW50KGh0bWxfY2Y1MmQ3NjhhZmJmNDliZDk3NDcwMjVhOGQ4Mjg3YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzgwZjA4MDA1ZTdiNGM1N2EzMTUyODkzMmM5NWM3OWMuYmluZFBvcHVwKHBvcHVwX2MyMTM2MjJkYjUwMTQ4ZTE4MjIzNjg5NGQzOTg3MzQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkOTRmZDA5OWFiODQ1NTJhZjljNDk2YWY0NGZiMDgyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg3NjMwODk1LC00My45NTY1NzUyMTkzNjQxMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdkZmUwNTc5YjZlNDU3N2E0YjZmM2U2ODI2YzAzNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQ2ZWM3NWNhZmQyNDI3MThjOGZmNWUwYmRlMzEzMmIgPSAkKCc8ZGl2IGlkPSJodG1sXzE0NmVjNzVjYWZkMjQyNzE4YzhmZjVlMGJkZTMxMzJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tw4NPIEZSQU5DSVNDTyBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iN2RmZTA1NzliNmU0NTc3YTRiNmYzZTY4MjZjMDM2OS5zZXRDb250ZW50KGh0bWxfMTQ2ZWM3NWNhZmQyNDI3MThjOGZmNWUwYmRlMzEzMmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGQ5NGZkMDk5YWI4NDU1MmFmOWM0OTZhZjQ0ZmIwODIuYmluZFBvcHVwKHBvcHVwX2I3ZGZlMDU3OWI2ZTQ1NzdhNGI2ZjNlNjgyNmMwMzY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZjOWU4MTlkOTUxODRjN2RiYmQ2MjY0MDEwMDI3ZmFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgwODQ3NjQsLTQzLjk3Njc2NzI2Nzc2Njk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwNTYzOGVmYWM3MDRlMjQ5MTNiZjcwYTA5MWQ2ZjAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0M2VkZjk2MDlhNTQ4ZTZiOWUwZDQxODhhYTU2OTM5ID0gJCgnPGRpdiBpZD0iaHRtbF8zNDNlZGY5NjA5YTU0OGU2YjllMGQ0MTg4YWE1NjkzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkVOREEgTk9WQSBDbGFzcyByZWd1bGFyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDU2MzhlZmFjNzA0ZTI0OTEzYmY3MGEwOTFkNmYwMi5zZXRDb250ZW50KGh0bWxfMzQzZWRmOTYwOWE1NDhlNmI5ZTBkNDE4OGFhNTY5MzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmM5ZTgxOWQ5NTE4NGM3ZGJiZDYyNjQwMTAwMjdmYWQuYmluZFBvcHVwKHBvcHVwXzMwNTYzOGVmYWM3MDRlMjQ5MTNiZjcwYTA5MWQ2ZjAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzNDQxOGMyZDVlZDQzNGE5OTdlMTVhZDdkNWEyNzc5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgyMjQ1OTI1LC00My45NDg3NzgwNTkwMjQwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMGU3OTliMjVkNjY0NWFkYmU4MGZkMzUxOTU3YmIyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OGQwMjZkMTQxNGM0Y2E1OGRjYTAxOWYxMTExYzcxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjhkMDI2ZDE0MTRjNGNhNThkY2EwMTlmMTExMWM3MTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZJTEEgQ0xPUklTIENsYXNzIHJlZ3VsYXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwZTc5OWIyNWQ2NjQ1YWRiZTgwZmQzNTE5NTdiYjIxLnNldENvbnRlbnQoaHRtbF82OGQwMjZkMTQxNGM0Y2E1OGRjYTAxOWYxMTExYzcxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMzQ0MThjMmQ1ZWQ0MzRhOTk3ZTE1YWQ3ZDVhMjc3OS5iaW5kUG9wdXAocG9wdXBfMzBlNzk5YjI1ZDY2NDVhZGJlODBmZDM1MTk1N2JiMjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI3Y2MwYjI1OTRiNGNkN2IwMDBkNjg2Mjc1YmQ1NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODUxOTA0OCwtNDMuOTQ3NzM4NzY4OTgwNTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjJiMDc3NGE3NzA2NDkwOWE4MzJkZDBkMzM3ZWVjYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUwN2VkNzczNGZiNDE1MjkxMWQzZDA4NTdhYmI0OTAgPSAkKCc8ZGl2IGlkPSJodG1sX2M1MDdlZDc3MzRmYjQxNTI5MTFkM2QwODU3YWJiNDkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BRVJPUE9SVE8gQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjJiMDc3NGE3NzA2NDkwOWE4MzJkZDBkMzM3ZWVjYTYuc2V0Q29udGVudChodG1sX2M1MDdlZDc3MzRmYjQxNTI5MTFkM2QwODU3YWJiNDkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyN2NjMGIyNTk0YjRjZDdiMDAwZDY4NjI3NWJkNTQ0LmJpbmRQb3B1cChwb3B1cF8yMmIwNzc0YTc3MDY0OTA5YTgzMmRkMGQzMzdlZWNhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZDJlNDY4MWUxYTg0OGE4YjNhZTZiZGZlYjYzY2RhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MzMxNzM5OTk5OTk5OTgsLTQzLjk2OTA3NzE0NzMyNTM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlZDMxMzQyYWQwZTQxMGI5NTZlZDc1Y2M5MjE2Mzc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4NTQwYTI3NDAwNTRmNDZiNmE2Y2I0NTQyYTY1OWI5ID0gJCgnPGRpdiBpZD0iaHRtbF8zODU0MGEyNzQwMDU0ZjQ2YjZhNmNiNDU0MmE2NTliOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QUxUTyBCQVJST0NBIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlZDMxMzQyYWQwZTQxMGI5NTZlZDc1Y2M5MjE2Mzc0LnNldENvbnRlbnQoaHRtbF8zODU0MGEyNzQwMDU0ZjQ2YjZhNmNiNDU0MmE2NTliOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZDJlNDY4MWUxYTg0OGE4YjNhZTZiZGZlYjYzY2RhYi5iaW5kUG9wdXAocG9wdXBfY2VkMzEzNDJhZDBlNDEwYjk1NmVkNzVjYzkyMTYzNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQ1ZDU5MmQ1MDkyNGQ3YzgwZmExNTQxMmM0Y2I2MDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODk3Njg3NDUsLTQzLjk3NTMzMzA0NjMzMzA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkMmMwZWRkOWZiYTRkNzBiMzI5NzZhMmVkMDRkM2FmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjMzQ4YzIwMzFmOTQyZDY5ZGQ3ZWFhZDNlMDEzNTc5ID0gJCgnPGRpdiBpZD0iaHRtbF80YzM0OGMyMDMxZjk0MmQ2OWRkN2VhYWQzZTAxMzU3OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QUxUTyBET1MgQ0FJQ0FSQVMgQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmQyYzBlZGQ5ZmJhNGQ3MGIzMjk3NmEyZWQwNGQzYWYuc2V0Q29udGVudChodG1sXzRjMzQ4YzIwMzFmOTQyZDY5ZGQ3ZWFhZDNlMDEzNTc5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JkNWQ1OTJkNTA5MjRkN2M4MGZhMTU0MTJjNGNiNjAwLmJpbmRQb3B1cChwb3B1cF82ZDJjMGVkZDlmYmE0ZDcwYjMyOTc2YTJlZDA0ZDNhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTg0MWQzOTUzYTI0OWY1OGU4YmZkMWVmZDA0YjIwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MjMzODE2MDAwMDAwMDMsLTQzLjk1MjAxMDgyMjczMjQyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmMGMwNzBjZjZlMjQwMGVhOTVmMjQwNGExYzZkOTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4YjU5YmVkMDhjZTRiODk5ZjhjOThhM2FmYWQyNDJkID0gJCgnPGRpdiBpZD0iaHRtbF9jOGI1OWJlZDA4Y2U0Yjg5OWY4Yzk4YTNhZmFkMjQyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QkFSUk8gUFJFVE8gQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWYwYzA3MGNmNmUyNDAwZWE5NWYyNDA0YTFjNmQ5NDAuc2V0Q29udGVudChodG1sX2M4YjU5YmVkMDhjZTRiODk5ZjhjOThhM2FmYWQyNDJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlODQxZDM5NTNhMjQ5ZjU4ZThiZmQxZWZkMDRiMjBmLmJpbmRQb3B1cChwb3B1cF85ZjBjMDcwY2Y2ZTI0MDBlYTk1ZjI0MDRhMWM2ZDk0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODUwNjg3NGYwM2I0NmE2YWI5NjdlYmU2OWIyM2M5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MzM3NDMzNSwtNDMuOTYzOTk2NDQyNzQ0NTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY5NDExNjUxMzRhNDE0NGI5NTQxM2MxYTNmNzk1ZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzNmODk3YzFlNzJhNGIyY2I0OGNkMzNkOTQxNTk3YzEgPSAkKCc8ZGl2IGlkPSJodG1sXzMzZjg5N2MxZTcyYTRiMmNiNDhjZDMzZDk0MTU5N2MxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CQVJST0NBIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmOTQxMTY1MTM0YTQxNDRiOTU0MTNjMWEzZjc5NWYyLnNldENvbnRlbnQoaHRtbF8zM2Y4OTdjMWU3MmE0YjJjYjQ4Y2QzM2Q5NDE1OTdjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hODUwNjg3NGYwM2I0NmE2YWI5NjdlYmU2OWIyM2M5OS5iaW5kUG9wdXAocG9wdXBfMmY5NDExNjUxMzRhNDE0NGI5NTQxM2MxYTNmNzk1ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmQwNGI0ODJkNDI0NDFiOTkyM2RiNGE4NzEwYTMzMTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTc2MDA4ODUsLTQzLjk2ODk3OTQzNzY1MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJkZDI2Nzk2ZDFkNzRiNGFhYjUyY2MwYzY0MTA4ZTRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwMzFlMzkzZjA5NzQ1NDI4YzA1NWQzZTA2YTc2ZWJiID0gJCgnPGRpdiBpZD0iaHRtbF85MDMxZTM5M2YwOTc0NTQyOGMwNTVkM2UwNmE3NmViYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSSVRJUyBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGQyNjc5NmQxZDc0YjRhYWI1MmNjMGM2NDEwOGU0Zi5zZXRDb250ZW50KGh0bWxfOTAzMWUzOTNmMDk3NDU0MjhjMDU1ZDNlMDZhNzZlYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmQwNGI0ODJkNDI0NDFiOTkyM2RiNGE4NzEwYTMzMTEuYmluZFBvcHVwKHBvcHVwXzJkZDI2Nzk2ZDFkNzRiNGFhYjUyY2MwYzY0MTA4ZTRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxYWUwNjdiY2NmMjRjMTg4M2U2N2RhNzYwZTU3ZDA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg3OTMwMTcsLTQzLjk5OTU5ODc5OTk5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kN2FhY2QzYzE3YWY0OWQ0OTNkM2I2NmFmZmUyOTYxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZGZmMjYxMDIwMWE0N2NjYmNhNzhjNTg0YmFiNzcwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmRmZjI2MTAyMDFhNDdjY2JjYTc4YzU4NGJhYjc3MDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNBU1RFTE8gQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDdhYWNkM2MxN2FmNDlkNDkzZDNiNjZhZmZlMjk2MTMuc2V0Q29udGVudChodG1sX2JkZmYyNjEwMjAxYTQ3Y2NiY2E3OGM1ODRiYWI3NzA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MxYWUwNjdiY2NmMjRjMTg4M2U2N2RhNzYwZTU3ZDA0LmJpbmRQb3B1cChwb3B1cF9kN2FhY2QzYzE3YWY0OWQ0OTNkM2I2NmFmZmUyOTYxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZmNhZTRmNjA0OTg0NzhmODgwODgwZTE4ZDNkOWU0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MTkzMzA4LC00My45NDAzNDg4MzczOTg4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzZkYzM4Yzg1NjU0YmRlOWZjNDZlYzJlMWJlOThiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjE1ZGY3ZDAxMTM0NTU2YTk2NWE2YmU1NDYxYWYwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWIxNWRmN2QwMTEzNDU1NmE5NjVhNmJlNTQ2MWFmMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNFTlRSTyBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MzZkYzM4Yzg1NjU0YmRlOWZjNDZlYzJlMWJlOThiNC5zZXRDb250ZW50KGh0bWxfNWIxNWRmN2QwMTEzNDU1NmE5NjVhNmJlNTQ2MWFmMGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWZjYWU0ZjYwNDk4NDc4Zjg4MDg4MGUxOGQzZDllNDEuYmluZFBvcHVwKHBvcHVwXzUzNmRjMzhjODU2NTRiZGU5ZmM0NmVjMmUxYmU5OGI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I3MmVjZWVlYTEzMzQ0ZmZhYTdkZDQ1YTBjZGQ4M2VlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkwOTQzOTAwMDAwMDAwMywtNDMuOTM3MTM3N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Yjk1NmQ2YzJkNDI0MjQ4YTg1Y2EwYTNiNTgyZjYyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODc5YjlmOTQ2NDM0MzcxYWIyODZjODI5ZjNkOTE1MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg3OWI5Zjk0NjQzNDM3MWFiMjg2YzgyOWYzZDkxNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNPTEVHSU8gQkFUSVNUQSBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Yjk1NmQ2YzJkNDI0MjQ4YTg1Y2EwYTNiNTgyZjYyMy5zZXRDb250ZW50KGh0bWxfZTg3OWI5Zjk0NjQzNDM3MWFiMjg2YzgyOWYzZDkxNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjcyZWNlZWVhMTMzNDRmZmFhN2RkNDVhMGNkZDgzZWUuYmluZFBvcHVwKHBvcHVwXzZiOTU2ZDZjMmQ0MjQyNDhhODVjYTBhM2I1ODJmNjIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyMmJmNTA1OTMyZjQyYTBhOWFiODFiNzIyMmRlMTg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkyNDEyMTYwMDAwMDAwMywtNDMuOTg5NTAyMDMyNDk3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzA2NDI5NjI0NWY0NTZlOTg2NDVlZDkwNzQ2NjhmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZWNmNjg1MGU3Njk0N2JkYjNmNDBhMDE0ZTQwY2ViMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWVjZjY4NTBlNzY5NDdiZGIzZjQwYTAxNGU0MGNlYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNPUkFDQU8gRVVDQVJJU1RJQ08gQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzMwNjQyOTYyNDVmNDU2ZTk4NjQ1ZWQ5MDc0NjY4Zjguc2V0Q29udGVudChodG1sX2VlY2Y2ODUwZTc2OTQ3YmRiM2Y0MGEwMTRlNDBjZWIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyMmJmNTA1OTMyZjQyYTBhOWFiODFiNzIyMmRlMTg1LmJpbmRQb3B1cChwb3B1cF8zMzA2NDI5NjI0NWY0NTZlOTg2NDVlZDkwNzQ2NjhmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZGE1N2E3MjdjOWM0ZTQ0YTU1YmE4NmQ1OWUzYjEyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NTg1NzE4NSwtNDMuOTQwNDU5MzI3Njg0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYmQ3ZjBhNTYxOTE0NGY0YWZlZjU4Mzg0ODFmMmZhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTIxZmQ5Yjc0OGI0MzQ2OTQ2ZGQ0MTU1ODBjZjc0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTkyMWZkOWI3NDhiNDM0Njk0NmRkNDE1NTgwY2Y3NDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRPTkEgQ0xBUkEgQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJkN2YwYTU2MTkxNDRmNGFmZWY1ODM4NDgxZjJmYTcuc2V0Q29udGVudChodG1sX2E5MjFmZDliNzQ4YjQzNDY5NDZkZDQxNTU4MGNmNzQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkYTU3YTcyN2M5YzRlNDRhNTViYTg2ZDU5ZTNiMTJiLmJpbmRQb3B1cChwb3B1cF8xYmQ3ZjBhNTYxOTE0NGY0YWZlZjU4Mzg0ODFmMmZhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjVjMzhjZmQ4NTg0YjYwODA5ZjRmNWQzNjFmODk1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NjMxMjU3LC00My45NjExMDk1NDUzMDQyOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGNkOTJjMzcyNmI0YjM1ODQ1ZDA0MzU5ODkyMDE3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZWFkNjY4NTc0YjQ0ZGZiYjdjNjg4Y2MxNzlhNTY5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmVhZDY2ODU3NGI0NGRmYmI3YzY4OGNjMTc5YTU2OTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVTVE9SSUwgQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTBjZDkyYzM3MjZiNGIzNTg0NWQwNDM1OTg5MjAxNzEuc2V0Q29udGVudChodG1sXzJlYWQ2Njg1NzRiNDRkZmJiN2M2ODhjYzE3OWE1Njk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiNWMzOGNmZDg1ODRiNjA4MDlmNGY1ZDM2MWY4OTU4LmJpbmRQb3B1cChwb3B1cF9lMGNkOTJjMzcyNmI0YjM1ODQ1ZDA0MzU5ODkyMDE3MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZmUwNWM2NmNmMGU0MzNlYWY1M2FkNWYzNzA4MDlmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MTI3NDYzOTk5OTk5OTYsLTQzLjkzMDIwMDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJmMzJkZjdiMmEwNDk1YWExNTRmMWVjMGVlZTZkZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjJjNTBlZjE4OTFlNDAzZWFjNzA2MmI1MTUyYWEwOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzIyYzUwZWYxODkxZTQwM2VhYzcwNjJiNTE1MmFhMDk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GTE9SRVNUQSBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMmYzMmRmN2IyYTA0OTVhYTE1NGYxZWMwZWVlNmRmNC5zZXRDb250ZW50KGh0bWxfMjJjNTBlZjE4OTFlNDAzZWFjNzA2MmI1MTUyYWEwOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmZlMDVjNjZjZjBlNDMzZWFmNTNhZDVmMzcwODA5ZjYuYmluZFBvcHVwKHBvcHVwX2EyZjMyZGY3YjJhMDQ5NWFhMTU0ZjFlYzBlZWU2ZGY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3NmVmZmNkMWViZTRiMDk5Mjg1Y2U5MjkwOGViZjBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkzODg3OTY1LC00My45NjU2NzM5MjgwODI3NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTMwOTIzMTJhMjZkNDcyNjhhNzM4NDc3ODc1ZTE2MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzZiNzc2MWE5YmE1NGIzODhjNzBiNmU2ZDNlNmIxY2UgPSAkKCc8ZGl2IGlkPSJodG1sX2M2Yjc3NjFhOWJhNTRiMzg4YzcwYjZlNmQzZTZiMWNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HUkFKQVUgQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTMwOTIzMTJhMjZkNDcyNjhhNzM4NDc3ODc1ZTE2MTMuc2V0Q29udGVudChodG1sX2M2Yjc3NjFhOWJhNTRiMzg4YzcwYjZlNmQzZTZiMWNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3NmVmZmNkMWViZTRiMDk5Mjg1Y2U5MjkwOGViZjBlLmJpbmRQb3B1cChwb3B1cF85MzA5MjMxMmEyNmQ0NzI2OGE3Mzg0Nzc4NzVlMTYxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMDZjZjNlMGZiOTM0YTY2YjIwYmY5YmIzODZiODc3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44MzY0MTMwNSwtNDMuOTU5ODc4NzI4NjMwODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY4M2MxNGNiMzE1NDFlMjgyZTdiNGUwZTc3NDQ2NzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjNiMTQ2NjM4NjUwNGI4YmI3NjYzZWMwN2IwYjM3YzEgPSAkKCc8ZGl2IGlkPSJodG1sXzYzYjE0NjYzODY1MDRiOGJiNzY2M2VjMDdiMGIzN2MxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JVEFQT0EgQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjY4M2MxNGNiMzE1NDFlMjgyZTdiNGUwZTc3NDQ2NzIuc2V0Q29udGVudChodG1sXzYzYjE0NjYzODY1MDRiOGJiNzY2M2VjMDdiMGIzN2MxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAwNmNmM2UwZmI5MzRhNjZiMjBiZjliYjM4NmI4Nzc1LmJpbmRQb3B1cChwb3B1cF82NjgzYzE0Y2IzMTU0MWUyODJlN2I0ZTBlNzc0NDY3Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTQ2YjE1ZWI0OTE0NjEwOWZmNDY3NTVlNjRkMGI5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NTY1NzgyNSwtNDMuOTQ5OTQzMzQ5MjYzNzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjU0Yjg1ODMxOTBmNGVmNDhkMWNlNzMwZjI3MmI0NmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTQwNjc4OWVhMTVjNGNjMWEyOGMxZDZjOTdmYTgyMTAgPSAkKCc8ZGl2IGlkPSJodG1sXzk0MDY3ODllYTE1YzRjYzFhMjhjMWQ2Yzk3ZmE4MjEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KQVJBR1VBIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1NGI4NTgzMTkwZjRlZjQ4ZDFjZTczMGYyNzJiNDZjLnNldENvbnRlbnQoaHRtbF85NDA2Nzg5ZWExNWM0Y2MxYTI4YzFkNmM5N2ZhODIxMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOTQ2YjE1ZWI0OTE0NjEwOWZmNDY3NTVlNjRkMGI5YS5iaW5kUG9wdXAocG9wdXBfZjU0Yjg1ODMxOTBmNGVmNDhkMWNlNzMwZjI3MmI0NmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWRkYjJhNDFiNGYwNGY4NWI3NmM5ZGY2MTdjMjhhZmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODQzOTAzNCwtNDMuOTYzMjUxMzA1NDA3MjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFmZTQ4NjFiMjk5NGY1MzkwMzUzN2E0ODNkZjRjZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTc3NDE2NTE4N2EyNGJjZWFhZDMwNDdhNDg1ZjZiMDcgPSAkKCc8ZGl2IGlkPSJodG1sXzk3NzQxNjUxODdhMjRiY2VhYWQzMDQ3YTQ4NWY2YjA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KQVJESU0gQVRMQU5USUNPIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhZmU0ODYxYjI5OTRmNTM5MDM1MzdhNDgzZGY0Y2RlLnNldENvbnRlbnQoaHRtbF85Nzc0MTY1MTg3YTI0YmNlYWFkMzA0N2E0ODVmNmIwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZGRiMmE0MWI0ZjA0Zjg1Yjc2YzlkZjYxN2MyOGFmZC5iaW5kUG9wdXAocG9wdXBfYmFmZTQ4NjFiMjk5NGY1MzkwMzUzN2E0ODNkZjRjZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWE0OTVjMjRlOTQ0NDBmMGFmODAxZmFiYmMwNzVjYzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODYxODM1OCwtNDMuOTU0NzU2OTE1MDUwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjYWJjYjIwNTc2OTRlMjBhMWM0MjYyNDkzYjIyZTYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4MDdmYzhjOTNjZjQ1OWM5YTUzNDVhNjY0YThhZDBmID0gJCgnPGRpdiBpZD0iaHRtbF8zODA3ZmM4YzkzY2Y0NTljOWE1MzQ1YTY2NGE4YWQwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TElCRVJEQURFIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYWJjYjIwNTc2OTRlMjBhMWM0MjYyNDkzYjIyZTYxLnNldENvbnRlbnQoaHRtbF8zODA3ZmM4YzkzY2Y0NTljOWE1MzQ1YTY2NGE4YWQwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYTQ5NWMyNGU5NDQ0MGYwYWY4MDFmYWJiYzA3NWNjMi5iaW5kUG9wdXAocG9wdXBfZmNhYmNiMjA1NzY5NGUyMGExYzQyNjI0OTNiMjJlNjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTc0NGQ5NTVlMDNiNDNkNWE4M2ZjZjc3M2JhYzJkOWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTI5ODMwOCwtNDMuOTEzNjg5OTQ1NzM0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjMyMWIxNjk0NjdmNDEwMzhlODEwZGVhZjY0MTg2NzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ1ZmM3YTU0MDAxNDliODlkZDk4MDFkMjg5NTZkNjIgPSAkKCc8ZGl2IGlkPSJodG1sXzU0NWZjN2E1NDAwMTQ5Yjg5ZGQ5ODAxZDI4OTU2ZDYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT1ZPIFNBTyBMVUNBUyBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzIxYjE2OTQ2N2Y0MTAzOGU4MTBkZWFmNjQxODY3Ni5zZXRDb250ZW50KGh0bWxfNTQ1ZmM3YTU0MDAxNDliODlkZDk4MDFkMjg5NTZkNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTc0NGQ5NTVlMDNiNDNkNWE4M2ZjZjc3M2JhYzJkOWQuYmluZFBvcHVwKHBvcHVwXzYzMjFiMTY5NDY3ZjQxMDM4ZTgxMGRlYWY2NDE4Njc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyN2U0NDBjZmIxNzQ4NjY4OGUzM2QxZTQ3MGE0OGM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg3MjI1MzYsLTQzLjk4Mjk4NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWVmYzU3MmZiMGQxNGRhZWI2YzNiYjE3NzFiZjUzOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODY0ZGFiNjA0OWMxNGNkZTgxNmM2ZDlmYTg5MjViMGMgPSAkKCc8ZGl2IGlkPSJodG1sXzg2NGRhYjYwNDljMTRjZGU4MTZjNmQ5ZmE4OTI1YjBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVVJPIFBSRVRPIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlZmM1NzJmYjBkMTRkYWViNmMzYmIxNzcxYmY1MzllLnNldENvbnRlbnQoaHRtbF84NjRkYWI2MDQ5YzE0Y2RlODE2YzZkOWZhODkyNWIwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjdlNDQwY2ZiMTc0ODY2ODhlMzNkMWU0NzBhNDhjNC5iaW5kUG9wdXAocG9wdXBfMWVmYzU3MmZiMGQxNGRhZWI2YzNiYjE3NzFiZjUzOWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjAwY2QyMmMxNjBhNGMzMmJmNjhjYTQ3MTJkZjk5N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuODYzODAzNiwtNDMuOTc0OTI4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMDBlOWU0MWM5NmM0YmJiODhjYzhjMmY0ODBhZDQ5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODdiZDNkNGI5NmY0MzdmYWMwYWI5ZDQ4ZTM0N2JhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg3YmQzZDRiOTZmNDM3ZmFjMGFiOWQ0OGUzNDdiYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBBTVBVTEhBIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwMGU5ZTQxYzk2YzRiYmI4OGNjOGMyZjQ4MGFkNDk3LnNldENvbnRlbnQoaHRtbF81ODdiZDNkNGI5NmY0MzdmYWMwYWI5ZDQ4ZTM0N2JhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMDBjZDIyYzE2MGE0YzMyYmY2OGNhNDcxMmRmOTk3Yy5iaW5kUG9wdXAocG9wdXBfYzAwZTllNDFjOTZjNGJiYjg4Y2M4YzJmNDgwYWQ0OTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTU0Zjc4MjkxNzc3NDExZDkzMWQyNGQ5MjE1MTM5ZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTI0MTEzOSwtNDMuOTYyMzQ2MjY1NzI2NjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDYyZTU3NTdiYjRkNDc1MmFiNjUzNDE2MzMyMWEzZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmMwZDg5YjRjNWQ5NGQyYWIwMzI1YTljZGY0OGEwYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzZjMGQ4OWI0YzVkOTRkMmFiMDMyNWE5Y2RmNDhhMGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QUkFETyBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjJlNTc1N2JiNGQ0NzUyYWI2NTM0MTYzMzIxYTNlOS5zZXRDb250ZW50KGh0bWxfNmMwZDg5YjRjNWQ5NGQyYWIwMzI1YTljZGY0OGEwYWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTU0Zjc4MjkxNzc3NDExZDkzMWQyNGQ5MjE1MTM5ZGUuYmluZFBvcHVwKHBvcHVwXzA2MmU1NzU3YmI0ZDQ3NTJhYjY1MzQxNjMzMjFhM2U5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I3MDQ1MzhjYzM2ZTQ3M2Q5NzQ2YzhjMWRlZDAwMWRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgzOTA4NDc1LC00My45Nzc4ODQwNDEwMDQ4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMmFkZGRkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzJhZGRkZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZWFmMDY1ODZhOTg0Mzk2OWEwN2ExNTgyZjI1OWY1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85M2ZiNzk2OWFkZDk0ZmY4OTY5OTlhYjg0Y2RmOTc4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTNmYjc5NjlhZGQ5NGZmODk2OTk5YWI4NGNkZjk3ODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBTlRBIEFNRUxJQSBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZWFmMDY1ODZhOTg0Mzk2OWEwN2ExNTgyZjI1OWY1Ni5zZXRDb250ZW50KGh0bWxfOTNmYjc5NjlhZGQ5NGZmODk2OTk5YWI4NGNkZjk3ODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjcwNDUzOGNjMzZlNDczZDk3NDZjOGMxZGVkMDAxZGQuYmluZFBvcHVwKHBvcHVwXzZlYWYwNjU4NmE5ODQzOTY5YTA3YTE1ODJmMjU5ZjU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiYjhjOGZkNzM3YjQ2OWI5ZjIyNzM5N2E5NjI4MWI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjgzNDc0OTksLTQzLjk2NzgxMTkwMDc2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzJhZGRkZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMyYWRkZGQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg4YmNhMzQxYTc3NDcyODliMTdlYTA4MTkwZDhkOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGVlMDliZDkzMjA5NDRmZmIxZDMxMDJkM2EzZTQ4NTkgPSAkKCc8ZGl2IGlkPSJodG1sX2RlZTA5YmQ5MzIwOTQ0ZmZiMWQzMTAyZDNhM2U0ODU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQU5UQSBCUkFOQ0EgQ2xhc3MgaGlnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTg4YmNhMzQxYTc3NDcyODliMTdlYTA4MTkwZDhkOTYuc2V0Q29udGVudChodG1sX2RlZTA5YmQ5MzIwOTQ0ZmZiMWQzMTAyZDNhM2U0ODU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiYjhjOGZkNzM3YjQ2OWI5ZjIyNzM5N2E5NjI4MWI0LmJpbmRQb3B1cChwb3B1cF81ODhiY2EzNDFhNzc0NzI4OWIxN2VhMDgxOTBkOGQ5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jY2MwYjNiNDRmNDI0OTU0YmJmZGYzYzVhMjZkZWNmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS44NjM0ODEzOTk5OTk5OTgsLTQzLjk0NjMxNjk5MzEzMTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0M2VkZmM5ZWYzODQ1NWM4NmUwNWVkNzU4MTRiMTQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1MWIwNjE4OTE2NDRiMWI5NGNjNjg0ODM5OGY4YTZmID0gJCgnPGRpdiBpZD0iaHRtbF82NTFiMDYxODkxNjQ0YjFiOTRjYzY4NDgzOThmOGE2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0FOVEEgUk9TQSBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NDNlZGZjOWVmMzg0NTVjODZlMDVlZDc1ODE0YjE0Ny5zZXRDb250ZW50KGh0bWxfNjUxYjA2MTg5MTY0NGIxYjk0Y2M2ODQ4Mzk4ZjhhNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2NjMGIzYjQ0ZjQyNDk1NGJiZmRmM2M1YTI2ZGVjZmEuYmluZFBvcHVwKHBvcHVwXzY0M2VkZmM5ZWYzODQ1NWM4NmUwNWVkNzU4MTRiMTQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0ZWNjNjFkYjYyYjRlNThhODY5ZmEyNjFmMjQwYWVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkxNDg5MjEsLTQzLjkxNzA0NjE0MzY1MTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0NzVlZWUxOWMxNDQ4NGRhZjdlYzg2MGNhMDUwMGExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg5YTkyZWIxOTYxMzQ1NjU5NTFlM2FjNWY4NjU2Mzg5ID0gJCgnPGRpdiBpZD0iaHRtbF84OWE5MmViMTk2MTM0NTY1OTUxZTNhYzVmODY1NjM4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0FOVEEgVEVSRVpBIENsYXNzIGhpZ2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0NzVlZWUxOWMxNDQ4NGRhZjdlYzg2MGNhMDUwMGExLnNldENvbnRlbnQoaHRtbF84OWE5MmViMTk2MTM0NTY1OTUxZTNhYzVmODY1NjM4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNGVjYzYxZGI2MmI0ZTU4YTg2OWZhMjYxZjI0MGFlYy5iaW5kUG9wdXAocG9wdXBfYTQ3NWVlZTE5YzE0NDg0ZGFmN2VjODYwY2EwNTAwYTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmIwMjM5OWEyZTE5NGU3NDhhMGQ5ZDA3OGJlZTVjYzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTMxMTU2MzUsLTQzLjkyMTI2MTY5Mzk5MDYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMyYWRkZGQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMmFkZGRkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyNzNlN2UwNjc5MDRlMjA4YTBjYzgyOWI0MDIwMGQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzOGE3OWZhNjZmNjRhYmY5ZmU4ODU0OWI5OTE4ODZlID0gJCgnPGRpdiBpZD0iaHRtbF8wMzhhNzlmYTY2ZjY0YWJmOWZlODg1NDliOTkxODg2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U8ODTyBMVUNBUyBDbGFzcyBoaWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMjczZTdlMDY3OTA0ZTIwOGEwY2M4MjliNDAyMDBkNC5zZXRDb250ZW50KGh0bWxfMDM4YTc5ZmE2NmY2NGFiZjlmZTg4NTQ5Yjk5MTg4NmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmIwMjM5OWEyZTE5NGU3NDhhMGQ5ZDA3OGJlZTVjYzcuYmluZFBvcHVwKHBvcHVwX2EyNzNlN2UwNjc5MDRlMjA4YTBjYzgyOWI0MDIwMGQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyYzFlYmRkNjM0MzQzYmU4NWM2MmE0NjZkYmY3ODM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg1Nzk1ODcsLTQzLjk4ODI3OTc5OTk5OTk5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDZiNzFhNjExYjQ0NGNmYTdlYjhjMzhjNzViNDM5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNTkzMDI4YmU5ZGM0YjVhYmMxMTU0ZWI1Zjg5OWE5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTU5MzAyOGJlOWRjNGI1YWJjMTE1NGViNWY4OTlhOTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJBTkRFSVJBTlRFUyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkNmI3MWE2MTFiNDQ0Y2ZhN2ViOGMzOGM3NWI0MzkwLnNldENvbnRlbnQoaHRtbF8xNTkzMDI4YmU5ZGM0YjVhYmMxMTU0ZWI1Zjg5OWE5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MmMxZWJkZDYzNDM0M2JlODVjNjJhNDY2ZGJmNzgzNy5iaW5kUG9wdXAocG9wdXBfNGQ2YjcxYTYxMWI0NDRjZmE3ZWI4YzM4Yzc1YjQzOTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTdkNjI0ZjU5NTA5NDAxYmI0YTE3OTMyOTMzMDM3ODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTgwMjc1MTk5OTk5OTk4LC00My45NDY1NzAwNzcxNzI0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MDFjNWIxNzQ2MjY0NTNlOTc2OGNiZTYxODY0NjFiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzk5ZmYzZmYyYWE0YmRhYTlkMmE2MjQ2ZDE5ZWQzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTM5OWZmM2ZmMmFhNGJkYWE5ZDJhNjI0NmQxOWVkM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJFTFZFREVSRSBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYwMWM1YjE3NDYyNjQ1M2U5NzY4Y2JlNjE4NjQ2MWJmLnNldENvbnRlbnQoaHRtbF9hMzk5ZmYzZmYyYWE0YmRhYTlkMmE2MjQ2ZDE5ZWQzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85N2Q2MjRmNTk1MDk0MDFiYjRhMTc5MzI5MzMwMzc4Mi5iaW5kUG9wdXAocG9wdXBfNjAxYzViMTc0NjI2NDUzZTk3NjhjYmU2MTg2NDYxYmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDNjYjQ0MGUwYzJhNDZkZmEzNTI2OTVjZGE1YWRjMzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQzNDQyNiwtNDMuOTMyMDkyODE0NDA5OTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1MWZjOWRkZWY0MjQ0MWM5ZmQ4ZTc0OTAzNzM1YTBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0MjU3NTY2YjFjNzQ3OTc5NmE0N2EzNzA2MmM2Y2FmID0gJCgnPGRpdiBpZD0iaHRtbF84NDI1NzU2NmIxYzc0Nzk3OTZhNDdhMzcwNjJjNmNhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0FSTU8gQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNTFmYzlkZGVmNDI0NDFjOWZkOGU3NDkwMzczNWEwYy5zZXRDb250ZW50KGh0bWxfODQyNTc1NjZiMWM3NDc5Nzk2YTQ3YTM3MDYyYzZjYWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDNjYjQ0MGUwYzJhNDZkZmEzNTI2OTVjZGE1YWRjMzcuYmluZFBvcHVwKHBvcHVwXzA1MWZjOWRkZWY0MjQ0MWM5ZmQ4ZTc0OTAzNzM1YTBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4ZDZiNjUyMmZlMjQ0ZGQ5ZjdkODM3NjEzMjU3ZDJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkzODQ3NjcsLTQzLjk1MDY2MDA2NTM1NDM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxZTRiZWI1ZWU0YTQ2MTI5MjYyNzhlNGY4NGQyOTIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MmE4YjlhNzgwNzQwY2ZhYzczZTI4M2E2NjE5ODE4ID0gJCgnPGRpdiBpZD0iaHRtbF8zNDJhOGI5YTc4MDc0MGNmYWM3M2UyODNhNjYxOTgxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0lEQURFIEpBUkRJTSBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxZTRiZWI1ZWU0YTQ2MTI5MjYyNzhlNGY4NGQyOTIwLnNldENvbnRlbnQoaHRtbF8zNDJhOGI5YTc4MDc0MGNmYWM3M2UyODNhNjYxOTgxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOGQ2YjY1MjJmZTI0NGRkOWY3ZDgzNzYxMzI1N2QyZS5iaW5kUG9wdXAocG9wdXBfNzFlNGJlYjVlZTRhNDYxMjkyNjI3OGU0Zjg0ZDI5MjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTRkZjJiY2NmZDNhNGVjZGJmZTU4MzRhNzBmY2Q2YjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQ1ODc0MSwtNDMuOTUxMjI4NjI1NzcwODQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxYTlhNjFjYThlZjQwNzNiMjI4NDRmOWE2M2I2OWFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4OGFiZDA1ODYwZjQxMDNiODdlM2RlNWI4OTUwOWUxID0gJCgnPGRpdiBpZD0iaHRtbF82ODhhYmQwNTg2MGY0MTAzYjg3ZTNkZTViODk1MDllMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q09SQUNBTyBERSBKRVNVUyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcxYTlhNjFjYThlZjQwNzNiMjI4NDRmOWE2M2I2OWFhLnNldENvbnRlbnQoaHRtbF82ODhhYmQwNTg2MGY0MTAzYjg3ZTNkZTViODk1MDllMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NGRmMmJjY2ZkM2E0ZWNkYmZlNTgzNGE3MGZjZDZiOS5iaW5kUG9wdXAocG9wdXBfNzFhOWE2MWNhOGVmNDA3M2IyMjg0NGY5YTYzYjY5YWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2I0OTU4MGQzZmRmNDM3NGEzZDc5NTBhNjcwNmIwZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQ0MjU4OCwtNDMuOTI4NDEyOTYwNTk3MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDYwMzQ4NWZmN2YwNDBiZjhhOWFiMjk4MTBlNzhhM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQ0NWVhNDkyYWUyNGUwYmE1OWY1NzY2ZTQyOWE3ZDQgPSAkKCc8ZGl2IGlkPSJodG1sXzJkNDVlYTQ5MmFlMjRlMGJhNTlmNTc2NmU0MjlhN2Q0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DUlVaRUlSTyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2MDM0ODVmZjdmMDQwYmY4YTlhYjI5ODEwZTc4YTNhLnNldENvbnRlbnQoaHRtbF8yZDQ1ZWE0OTJhZTI0ZTBiYTU5ZjU3NjZlNDI5YTdkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYjQ5NTgwZDNmZGY0Mzc0YTNkNzk1MGE2NzA2YjBlNS5iaW5kUG9wdXAocG9wdXBfZDYwMzQ4NWZmN2YwNDBiZjhhOWFiMjk4MTBlNzhhM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2FiM2M2NjQxOWY1NDk2Njk1Y2UzMzVhMGYwMmM1MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTMyNTE2MiwtNDMuOTI3MzE4MjczNDYzMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzRhOTI1MzMyYjAyNGVlY2IzZjI0MjMyNmM1NzkxYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTMwODBlYmZiYTJlNDAzNmE0ZTMwZGM0NjNjY2EyOTcgPSAkKCc8ZGl2IGlkPSJodG1sX2UzMDgwZWJmYmEyZTQwMzZhNGUzMGRjNDYzY2NhMjk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GVU5DSU9OQVJJT1MgQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNGE5MjUzMzJiMDI0ZWVjYjNmMjQyMzI2YzU3OTFhMy5zZXRDb250ZW50KGh0bWxfZTMwODBlYmZiYTJlNDAzNmE0ZTMwZGM0NjNjY2EyOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2FiM2M2NjQxOWY1NDk2Njk1Y2UzMzVhMGYwMmM1MzQuYmluZFBvcHVwKHBvcHVwXzM0YTkyNTMzMmIwMjRlZWNiM2YyNDIzMjZjNTc5MWEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4MDIxNWE4Y2RhNDQwODg4MmY5MzI1YTM2NzQ4ZWRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5LjkzOTYzNzYsLTQzLjk1ODY2OTA5NTYxNDg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmM2Q4OTc2NjE2MTQxZWNhMWEyYTZmMzlmZTJiYjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwNzBlY2FmY2Q2NTQxMGY5NDI0ZDc5ZDMzNTExZDVhID0gJCgnPGRpdiBpZD0iaHRtbF82MDcwZWNhZmNkNjU0MTBmOTQyNGQ3OWQzMzUxMWQ1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R1VUSUVSUkVaIENsYXNzIGx1eHVyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2YzZDg5NzY2MTYxNDFlY2ExYTJhNmYzOWZlMmJiMjEuc2V0Q29udGVudChodG1sXzYwNzBlY2FmY2Q2NTQxMGY5NDI0ZDc5ZDMzNTExZDVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4MDIxNWE4Y2RhNDQwODg4MmY5MzI1YTM2NzQ4ZWRhLmJpbmRQb3B1cChwb3B1cF83ZjNkODk3NjYxNjE0MWVjYTFhMmE2ZjM5ZmUyYmIyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGMxOGNmMzJkNmM0Yzg2OTIxMTM4N2Q5ZjUyMjQ5ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45MzIxNTMxLC00My45NDM1NzUwNDg0MTA1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OWNlN2RiMmYzYzk0OTZiOWI4YjJmZjBkMjFiMTQyYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMjQ4YmFmMGRiNzE0ZWJlOGU5ZTg3MmZmZmMzYjNjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTI0OGJhZjBkYjcxNGViZThlOWU4NzJmZmZjM2IzY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxPVVJERVMgQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWNlN2RiMmYzYzk0OTZiOWI4YjJmZjBkMjFiMTQyYi5zZXRDb250ZW50KGh0bWxfMTI0OGJhZjBkYjcxNGViZThlOWU4NzJmZmZjM2IzY2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTRjMThjZjMyZDZjNGM4NjkyMTEzODdkOWY1MjI0OWUuYmluZFBvcHVwKHBvcHVwXzg5Y2U3ZGIyZjNjOTQ5NmI5YjhiMmZmMGQyMWIxNDJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViMjg4MjFkMmZlMjRmOTJiZDVjYjlmMTc2MWVhZTEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk0NjY1NzQsLTQzLjk1NjM2MzE3NTQwMTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0M2NiY2MyNTk4NjQyMjg4N2M2MjlkNjI3NjJhNGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzNzA0NWE0M2VjNzRjZDk5MTA2NDI4MGRlYmYxYWFmID0gJCgnPGRpdiBpZD0iaHRtbF8yMzcwNDVhNDNlYzc0Y2Q5OTEwNjQyODBkZWJmMWFhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TFVYRU1CVVJHTyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0M2NiY2MyNTk4NjQyMjg4N2M2MjlkNjI3NjJhNGNkLnNldENvbnRlbnQoaHRtbF8yMzcwNDVhNDNlYzc0Y2Q5OTEwNjQyODBkZWJmMWFhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjI4ODIxZDJmZTI0ZjkyYmQ1Y2I5ZjE3NjFlYWUxMC5iaW5kUG9wdXAocG9wdXBfNDQzY2JjYzI1OTg2NDIyODg3YzYyOWQ2Mjc2MmE0Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWM1MTQ3NjA4NDdhNDU1Mzg2ZjMzNjAwYTA0MTIxNTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTU1NDM0Mzk5OTk5OTk4LC00My45MTE2MDkyMTMzMTk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMDFhMWE0YzA4MWQ0OGFkYTg5N2FhZTEyZmJhNDAzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZmQ2ZjYzMDY5NjU0NDk4YTRlM2Y3NWNjNTc2YjljNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmZkNmY2MzA2OTY1NDQ5OGE0ZTNmNzVjYzU3NmI5YzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1BTkdBQkVJUkFTIENsYXNzIGx1eHVyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjAxYTFhNGMwODFkNDhhZGE4OTdhYWUxMmZiYTQwM2Uuc2V0Q29udGVudChodG1sX2JmZDZmNjMwNjk2NTQ0OThhNGUzZjc1Y2M1NzZiOWM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjNTE0NzYwODQ3YTQ1NTM4NmYzMzYwMGEwNDEyMTUzLmJpbmRQb3B1cChwb3B1cF8yMDFhMWE0YzA4MWQ0OGFkYTg5N2FhZTEyZmJhNDAzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMDQ4MWFlMTgwMGU0ZDkyYTJmOGFiZWFjZDVmMWY2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDc3MDQ2NSwtNDMuOTA0NjI5MDgxNTIwMDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTA0M2I1NDE5YjMwNGIwNTljMTRhYTBiMWQ4NzhmZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQ2YThkM2RkYmU1NGMzMWIzZGQ4MDc5ZDk3MGM1YmYgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0NmE4ZDNkZGJlNTRjMzFiM2RkODA3OWQ5NzBjNWJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QQVJRVUUgREFTIE1BTkdBQkVJUkFTIENsYXNzIGx1eHVyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTA0M2I1NDE5YjMwNGIwNTljMTRhYTBiMWQ4NzhmZWEuc2V0Q29udGVudChodG1sXzQ0NmE4ZDNkZGJlNTRjMzFiM2RkODA3OWQ5NzBjNWJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAwNDgxYWUxODAwZTRkOTJhMmY4YWJlYWNkNWYxZjY5LmJpbmRQb3B1cChwb3B1cF85MDQzYjU0MTliMzA0YjA1OWMxNGFhMGIxZDg3OGZlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTgyMDg5NzQ2NmY0MTlhYWNmZWZkZDVmN2IxZjQ2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NjMyMjU2LC00My45NDUxMDA5NjA5Mzc2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ODEyNDNjNjg0NDc0NDdjOGJlNWQwMTMzZmFkNTk2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTkyOGM3NTYyNzM0ZWQzYmEwMjMxY2VjODRlYzE3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2E5MjhjNzU2MjczNGVkM2JhMDIzMWNlYzg0ZWMxNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBTlRBIExVQ0lBIENsYXNzIGx1eHVyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzgxMjQzYzY4NDQ3NDQ3YzhiZTVkMDEzM2ZhZDU5NmEuc2V0Q29udGVudChodG1sXzdhOTI4Yzc1NjI3MzRlZDNiYTAyMzFjZWM4NGVjMTc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ExODIwODk3NDY2ZjQxOWFhY2ZlZmRkNWY3YjFmNDYzLmJpbmRQb3B1cChwb3B1cF83ODEyNDNjNjg0NDc0NDdjOGJlNWQwMTMzZmFkNTk2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOWExZTg5Y2UzOTc0YjE0YTYxYzlkMjlhZDQ3ZDRhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45Mjg4MTEzNSwtNDMuOTUxNDA3NDI5OTQ5MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNlNzM0MWU2YzJjNDhlM2FhMDRmMGFiNjBlYmFhMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWMxMWI4MzhkZDQyNDZhMDhlMjIxMGRiNWMwMzUyZjIgPSAkKCc8ZGl2IGlkPSJodG1sXzFjMTFiODM4ZGQ0MjQ2YTA4ZTIyMTBkYjVjMDM1MmYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQU5UTyBBR09TVElOSE8gQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iM2U3MzQxZTZjMmM0OGUzYWEwNGYwYWI2MGViYWEwNi5zZXRDb250ZW50KGh0bWxfMWMxMWI4MzhkZDQyNDZhMDhlMjIxMGRiNWMwMzUyZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzlhMWU4OWNlMzk3NGIxNGE2MWM5ZDI5YWQ0N2Q0YTUuYmluZFBvcHVwKHBvcHVwX2IzZTczNDFlNmMyYzQ4ZTNhYTA0ZjBhYjYwZWJhYTA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiZTU5MDgyMmRkMTQxMmE4NWIwZDlkZGJhNGIzYjEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk0MzMyOTQsLTQzLjk0MzQyMDI1MjE5MzQwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YmZiMDI1MDUwZTM0OGI4OTM3YTNmMzNlNjMyNGY3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDI2NTAwZDYxMzU0NjczODQ0ZTFjM2VhM2VhNzA5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2QyNjUwMGQ2MTM1NDY3Mzg0NGUxYzNlYTNlYTcwOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNBTlRPIEFOVE9OSU8gQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YmZiMDI1MDUwZTM0OGI4OTM3YTNmMzNlNjMyNGY3NS5zZXRDb250ZW50KGh0bWxfY2QyNjUwMGQ2MTM1NDY3Mzg0NGUxYzNlYTNlYTcwOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGJlNTkwODIyZGQxNDEyYTg1YjBkOWRkYmE0YjNiMTIuYmluZFBvcHVwKHBvcHVwXzRiZmIwMjUwNTBlMzQ4Yjg5MzdhM2YzM2U2MzI0Zjc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwNmY1ZWNlOThjNzRkMWRhNzhkNzFmMzI2ODNlYjA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljk1NzcwODY1LC00My45NTMyNDE1NDI1OTE1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZWY0Mzg1N2Q1N2Y0YmMwYmM5ZTFhOWM3NDAxN2Q2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZThjNmI5ZmJjMjk0NjFmOThlMWMyOWZjMzNlMjFhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2U4YzZiOWZiYzI5NDYxZjk4ZTFjMjlmYzMzZTIxYTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gQkVOVE8gQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZWY0Mzg1N2Q1N2Y0YmMwYmM5ZTFhOWM3NDAxN2Q2OS5zZXRDb250ZW50KGh0bWxfN2U4YzZiOWZiYzI5NDYxZjk4ZTFjMjlmYzMzZTIxYTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTA2ZjVlY2U5OGM3NGQxZGE3OGQ3MWYzMjY4M2ViMDYuYmluZFBvcHVwKHBvcHVwX2NlZjQzODU3ZDU3ZjRiYzBiYzllMWE5Yzc0MDE3ZDY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwYWNlODI2NTA1NDRmMDBhZWFjNTEyNjMxMDI4NGU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTE5Ljg2MDM4MzM5OTk5OTk5NiwtNDMuOTY2MTEwMTY2MjI1MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RmNDE3NTc0MTFlNGEwNmI5OWQzNmU5ZDA5ZjQ0NWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWVkZGM0MTAxZjhiNDc1MmJjYzMyNzM1NTE5Y2U5NjkgPSAkKCc8ZGl2IGlkPSJodG1sXzllZGRjNDEwMWY4YjQ3NTJiY2MzMjczNTUxOWNlOTY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tw4NPIEpPU0UgUEFNUFVMSEEgQ2xhc3MgbHV4dXJ5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGY0MTc1NzQxMWU0YTA2Yjk5ZDM2ZTlkMDlmNDQ1YS5zZXRDb250ZW50KGh0bWxfOWVkZGM0MTAxZjhiNDc1MmJjYzMyNzM1NTE5Y2U5NjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODBhY2U4MjY1MDU0NGYwMGFlYWM1MTI2MzEwMjg0ZTQuYmluZFBvcHVwKHBvcHVwX2NkZjQxNzU3NDExZTRhMDZiOTlkMzZlOWQwOWY0NDVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2MGE4Y2RkOTVjMzQ0Yzk5ZjVkYTA2YWVmZWIyOTAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbLTkuMjk0NDI3OSwtNDAuODI0OTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZDRkZDgwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYWYyYmUwNTM0NmI0YzE2OGZhNDcyODMwNWJhMzlmZSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjFhM2EwZjNmZTA0ODVjYmUzNzdiY2Y3OTNhZmJmNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNTAxY2NlZmRlNTE0ZWRkOTM3YTA2YjlmOGVhMDU4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjUwMWNjZWZkZTUxNGVkZDkzN2EwNmI5ZjhlYTA1ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlPDg08gTFVJUyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyMWEzYTBmM2ZlMDQ4NWNiZTM3N2JjZjc5M2FmYmY0LnNldENvbnRlbnQoaHRtbF9iNTAxY2NlZmRlNTE0ZWRkOTM3YTA2YjlmOGVhMDU4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNjBhOGNkZDk1YzM0NGM5OWY1ZGEwNmFlZmViMjkwMC5iaW5kUG9wdXAocG9wdXBfZTIxYTNhMGYzZmUwNDg1Y2JlMzc3YmNmNzkzYWZiZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2JlNzQ5ZGY2YmRjNGYwMDhlODEyNWM1YWM3ZDFhYmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQ3NjU5MDUsLTQzLjkzNzUwOTQ3MjYyNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiZWU3YTAyNjFkYTRmMDc5ODlmMTM3Yzg3MWY0ZTMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzMTlhMzg5MjQ2MzQ4MDJhZGE2ZTM0OGE1Y2Q3OGJkID0gJCgnPGRpdiBpZD0iaHRtbF82MzE5YTM4OTI0NjM0ODAyYWRhNmUzNDhhNWNkNzhiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U8ODTyBQRURSTyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiZWU3YTAyNjFkYTRmMDc5ODlmMTM3Yzg3MWY0ZTMwLnNldENvbnRlbnQoaHRtbF82MzE5YTM4OTI0NjM0ODAyYWRhNmUzNDhhNWNkNzhiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYmU3NDlkZjZiZGM0ZjAwOGU4MTI1YzVhYzdkMWFiZS5iaW5kUG9wdXAocG9wdXBfNGJlZTdhMDI2MWRhNGYwNzk4OWYxMzdjODcxZjRlMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzQ5OTU0NzE4ODZhNGYwYzhjMmVlNjU2ZTg3MTI3ZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTM1MjIwNSwtNDMuOTM0NDQ2MzQwMTk3NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWJlOWE4ZWRiYmI0NDg2Yjk4YzhmYmEzMDE2YjdkZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDA0Y2Q1NjJmNmVkNDgwZGEyODdlOGM5MzYxNzIzM2EgPSAkKCc8ZGl2IGlkPSJodG1sX2QwNGNkNTYyZjZlZDQ4MGRhMjg3ZThjOTM2MTcyMzNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TQVZBU1NJIENsYXNzIGx1eHVyeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJlOWE4ZWRiYmI0NDg2Yjk4YzhmYmEzMDE2YjdkZWMuc2V0Q29udGVudChodG1sX2QwNGNkNTYyZjZlZDQ4MGRhMjg3ZThjOTM2MTcyMzNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc0OTk1NDcxODg2YTRmMGM4YzJlZTY1NmU4NzEyN2Y4LmJpbmRQb3B1cChwb3B1cF8xYmU5YThlZGJiYjQ0ODZiOThjOGZiYTMwMTZiN2RlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWY3ZTQ2NzY1YTQ0ZmY5YTI3MTc5MmQzMmQ0YmNjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWy0xOS45NDA1NTU3NSwtNDMuOTE4NDIzMDQ0OTU1NTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2Q0ZGQ4MCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNkNGRkODAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGFmMmJlMDUzNDZiNGMxNjhmYTQ3MjgzMDViYTM5ZmUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDgzZDg4NTFlY2YzNDQzMGFlM2Q3YzBhYWY3ODQwYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDIzZjlhOTJkMWNiNDRmYzhlNzA5YzBkNTY1ZGIyMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzQyM2Y5YTkyZDFjYjQ0ZmM4ZTcwOWMwZDU2NWRiMjAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TRVJSQSBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4M2Q4ODUxZWNmMzQ0MzBhZTNkN2MwYWFmNzg0MGM2LnNldENvbnRlbnQoaHRtbF80MjNmOWE5MmQxY2I0NGZjOGU3MDljMGQ1NjVkYjIwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNWY3ZTQ2NzY1YTQ0ZmY5YTI3MTc5MmQzMmQ0YmNjNi5iaW5kUG9wdXAocG9wdXBfMDgzZDg4NTFlY2YzNDQzMGFlM2Q3YzBhYWY3ODQwYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNmYzc4ZjY5NzFmNDhhNWJhNGRkNjlkZTJjZjU2ODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTQ5MzYyNCwtNDMuOTMyNTg2OTAwMDAwMDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0YzNhY2VkMjNiMDRiN2M4OGNkM2RlMzkzMWUyMDQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4Y2I4Yjg3YTVjMzQ0OTdiZDhlMGUxOThmNzBiYzc0ID0gJCgnPGRpdiBpZD0iaHRtbF9iOGNiOGI4N2E1YzM0NDk3YmQ4ZTBlMTk4ZjcwYmM3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0lPTiBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0YzNhY2VkMjNiMDRiN2M4OGNkM2RlMzkzMWUyMDQyLnNldENvbnRlbnQoaHRtbF9iOGNiOGI4N2E1YzM0NDk3YmQ4ZTBlMTk4ZjcwYmM3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yY2ZjNzhmNjk3MWY0OGE1YmE0ZGQ2OWRlMmNmNTY4My5iaW5kUG9wdXAocG9wdXBfZDRjM2FjZWQyM2IwNGI3Yzg4Y2QzZGUzOTMxZTIwNDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmM4ZWU0M2RmY2RlNDRhN2FkM2VmNjMzMzZhODFhNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFstMTkuOTUwNjE5MjUsLTQzLjk1MDI2MzU4NjcyOTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNkNGRkODAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZDRkZDgwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2RhZjJiZTA1MzQ2YjRjMTY4ZmE0NzI4MzA1YmEzOWZlKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzZTU4MWZkNmRlYjQzY2I4YTg0N2VhOGJiMWVjZjBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4YmY1YmI2M2U3NjRiMjI5ODlhMGMxYzE4NGIzZmFhID0gJCgnPGRpdiBpZD0iaHRtbF9lOGJmNWJiNjNlNzY0YjIyOTg5YTBjMWMxODRiM2ZhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VklMQSBQQVJJUyBDbGFzcyBsdXh1cnk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzZTU4MWZkNmRlYjQzY2I4YTg0N2VhOGJiMWVjZjBhLnNldENvbnRlbnQoaHRtbF9lOGJmNWJiNjNlNzY0YjIyOTg5YTBjMWMxODRiM2ZhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYzhlZTQzZGZjZGU0NGE3YWQzZWY2MzMzNmE4MWE3MS5iaW5kUG9wdXAocG9wdXBfYjNlNTgxZmQ2ZGViNDNjYjhhODQ3ZWE4YmIxZWNmMGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f97cb9d4d30>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"classes = {'low':0, 'regular':1, 'high':2, 'luxury':3}\n",
"\n",
"\n",
"ilat = -19.9227318\n",
"ilon = -43.9450948\n",
"\n",
"# create map\n",
"map_classes = folium.Map(location=[ilat, ilon], zoom_start=11)\n",
"\n",
"# set color scheme for the clusters\n",
"x = np.arange(4)\n",
"ys = [i + x + (i*x)**2 for i in range(4)]\n",
"colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n",
"rainbow = [colors.rgb2hex(i) for i in colors_array]\n",
"\n",
"# add markers to the map\n",
"markers_colors = []\n",
"for lat, lon, poi, socialclass in zip(bairros['Latitude'], bairros['Longitude'], bairros['Neighborhood'], bairros['Class']):\n",
" label = folium.Popup(str(poi) + ' Class ' + socialclass, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lon],\n",
" radius=5,\n",
" popup=label,\n",
" color=rainbow[classes[socialclass]-1],\n",
" fill=True,\n",
" fill_color=rainbow[classes[socialclass]-1],\n",
" fill_opacity=0.7).add_to(map_classes)\n",
" \n",
"map_classes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By viewing the map it's clear that geopy defined many points out of bounds of Belo Horizonte. Besides that, as I live in Belo Horizonte, I could detect some neighborhoods far from downtown that were inacurately defined by geopy.\n",
"\n",
"So, we chose to restrict the analysis to neighborhoods not far from downtown.\n",
"\n",
"Also, the location of \"Pindorama\" neighborhood, near from downtown, is remarkably wrong. So it will be removed too."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"df = bairros[(bairros['Latitude']<ilat+0.09) & (bairros['Latitude']>ilat-0.09) & (bairros['Longitude']>ilon-0.06) & (bairros['Longitude']<ilon+0.06)]\n",
"df = df[df['Neighborhood'] != 'PINDORAMA']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we have the Latitude and Longitude for each neighborhood, so we are ready to make Foursquare API calls on \"query\" endpoint.\n",
"\n",
"Actually, for each neighborhood we made 4 API calls, one for each category: \"food\", \"stores and services\" and \"professional\", and one for all categories combined.\n",
"\n",
"So there will be 4 resulting datasets, one for each category, plus one for all categories combined, and it will look like this:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"categories = {\n",
" 'food': '4d4b7105d754a06374d81259',\n",
" 'stores': '4d4b7105d754a06378d81259', \n",
" 'profissional': '4d4b7105d754a06375d81259'\n",
"}\n",
"\n",
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']\n",
" \n",
"\n",
"# function that returns nearby venues by accessing foursquare \n",
"def getNearbyVenues(names, latitudes, longitudes, category, radius=500, LIMIT=150):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes): \n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}&categoryId={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT,\n",
" category\n",
" )\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['id'], \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Neighborhood', \n",
" 'Neighborhood Latitude', \n",
" 'Neighborhood Longitude', \n",
" 'ID', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>ID</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>4eb1d86e77c814d925751c99</td>\n",
" <td>Chapa Mágica</td>\n",
" <td>-19.845448</td>\n",
" <td>-43.921754</td>\n",
" <td>BBQ Joint</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>5bf1cc4275eee40039f91adf</td>\n",
" <td>Burger King</td>\n",
" <td>-19.846823</td>\n",
" <td>-43.919360</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>4daba4b84b22f071ead33715</td>\n",
" <td>Celo Burguer</td>\n",
" <td>-19.847524</td>\n",
" <td>-43.919394</td>\n",
" <td>Burger Joint</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>516dc84d498e618c69124919</td>\n",
" <td>bobs</td>\n",
" <td>-19.846710</td>\n",
" <td>-43.917326</td>\n",
" <td>Burger Joint</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>539991af498ea6a823188d29</td>\n",
" <td>Padaria Vila Verde</td>\n",
" <td>-19.847362</td>\n",
" <td>-43.921778</td>\n",
" <td>Bakery</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude \\\n",
"0 AARAO REIS -19.847221 -43.919508 \n",
"1 AARAO REIS -19.847221 -43.919508 \n",
"2 AARAO REIS -19.847221 -43.919508 \n",
"3 AARAO REIS -19.847221 -43.919508 \n",
"4 AARAO REIS -19.847221 -43.919508 \n",
"\n",
" ID Venue Venue Latitude \\\n",
"0 4eb1d86e77c814d925751c99 Chapa Mágica -19.845448 \n",
"1 5bf1cc4275eee40039f91adf Burger King -19.846823 \n",
"2 4daba4b84b22f071ead33715 Celo Burguer -19.847524 \n",
"3 516dc84d498e618c69124919 bobs -19.846710 \n",
"4 539991af498ea6a823188d29 Padaria Vila Verde -19.847362 \n",
"\n",
" Venue Longitude Venue Category \n",
"0 -43.921754 BBQ Joint \n",
"1 -43.919360 Fast Food Restaurant \n",
"2 -43.919394 Burger Joint \n",
"3 -43.917326 Burger Joint \n",
"4 -43.921778 Bakery "
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bh_food_venues = getNearbyVenues(names=df['Neighborhood'],\n",
" latitudes=df['Latitude'],\n",
" longitudes=df['Longitude'],\n",
" categories['food']\n",
" )\n",
"\n",
"bh_pro_venues = getNearbyVenues(names=df['Neighborhood'],\n",
" latitudes=df['Latitude'],\n",
" longitudes=df['Longitude'],\n",
" categories['professional']\n",
" )\n",
"\n",
"bh_stores_venues = getNearbyVenues(names=df['Neighborhood'],\n",
" latitudes=df['Latitude'],\n",
" longitudes=df['Longitude'],\n",
" categories['stores']\n",
" )\n",
"\n",
"bh_all_venues = getNearbyVenues(names=df['Neighborhood'],\n",
" latitudes=df['Latitude'],\n",
" longitudes=df['Longitude'],\n",
" ''\n",
" )\n",
"bh_food_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Methodology "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So now we have 4 clean datasets:\n",
"\n",
"* bh_food_venues\n",
"* bh_stores_venues\n",
"* bh_pro_venues\n",
"* bh_all_venues\n",
"\n",
"They will be our asset for training our model using classification algorithms - the venues categories will be its features (after an onehot) and the social class will be the target variable.\n",
"\n",
"The resulting models will be evaluated and we will show the best dataset and best classification algorithm for our goal.\n",
"\n",
"Let's pick one dataset and see if it's ready to go:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>ID</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>4eb1d86e77c814d925751c99</td>\n",
" <td>Chapa Mágica</td>\n",
" <td>-19.845448</td>\n",
" <td>-43.921754</td>\n",
" <td>BBQ Joint</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>5bf1cc4275eee40039f91adf</td>\n",
" <td>Burger King</td>\n",
" <td>-19.846823</td>\n",
" <td>-43.919360</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>4daba4b84b22f071ead33715</td>\n",
" <td>Celo Burguer</td>\n",
" <td>-19.847524</td>\n",
" <td>-43.919394</td>\n",
" <td>Burger Joint</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>516dc84d498e618c69124919</td>\n",
" <td>bobs</td>\n",
" <td>-19.846710</td>\n",
" <td>-43.917326</td>\n",
" <td>Burger Joint</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>AARAO REIS</td>\n",
" <td>-19.847221</td>\n",
" <td>-43.919508</td>\n",
" <td>539991af498ea6a823188d29</td>\n",
" <td>Padaria Vila Verde</td>\n",
" <td>-19.847362</td>\n",
" <td>-43.921778</td>\n",
" <td>Bakery</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude \\\n",
"0 AARAO REIS -19.847221 -43.919508 \n",
"1 AARAO REIS -19.847221 -43.919508 \n",
"2 AARAO REIS -19.847221 -43.919508 \n",
"3 AARAO REIS -19.847221 -43.919508 \n",
"4 AARAO REIS -19.847221 -43.919508 \n",
"\n",
" ID Venue Venue Latitude \\\n",
"0 4eb1d86e77c814d925751c99 Chapa Mágica -19.845448 \n",
"1 5bf1cc4275eee40039f91adf Burger King -19.846823 \n",
"2 4daba4b84b22f071ead33715 Celo Burguer -19.847524 \n",
"3 516dc84d498e618c69124919 bobs -19.846710 \n",
"4 539991af498ea6a823188d29 Padaria Vila Verde -19.847362 \n",
"\n",
" Venue Longitude Venue Category \n",
"0 -43.921754 BBQ Joint \n",
"1 -43.919360 Fast Food Restaurant \n",
"2 -43.919394 Burger Joint \n",
"3 -43.917326 Burger Joint \n",
"4 -43.921778 Bakery "
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bh_all_venues = pd.read_csv('bh_food_venues.csv')\n",
"bh_all_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we are going to use the Venues categories as features of our clustering algorithms, it's appropriate to avoid neighborhoods with small number of venues, because it's high potential to become outliers.\n",
"\n",
"Unfortunately, the dataset of stores become too small after that restriction, so it will be discarded.\n",
"\n",
"Now let's take a fast view on the most common Venues Categories of **bh_all_venues**:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Bakery 296\n",
"Bar 259\n",
"Brazilian Restaurant 230\n",
"Gym / Fitness Center 193\n",
"Burger Joint 165\n",
" ... \n",
"Fish Market 1\n",
"Speakeasy 1\n",
"Travel Agency 1\n",
"Design Studio 1\n",
"Butcher 1\n",
"Name: Venue Category, Length: 272, dtype: int64"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bh_all_venues['Venue Category'].value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looks like we are ready now to prepare our dataset to the classification algorithm.\n",
"\n",
"First we do one hot encoding and drop columns that are not features or target.\n",
"\n",
"Then we split training set with test set and build KNN, SVM and Logistic regression models.\n",
"\n",
"The target (y) will be tested in the following formats:\n",
"\n",
"* the actual class\n",
"* if the class == 'luxury'\n",
"* if the class == 'high'\n",
"* if the class == 'regular'\n",
"* if the class == 'low'\n",
"* if the class == 'high' or 'luxury'"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn import preprocessing\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn import svm\n",
"from sklearn import metrics\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"le = preprocessing.LabelEncoder()\n",
"le.fit([\"low\", \"regular\", \"high\", \"luxury\"])\n",
"\n",
"def prepare(df_v): # returns a dataset with only features and target\n",
" df_venues = df_v\n",
"\n",
" # one hot encoding\n",
" onehot = pd.get_dummies(df_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"\n",
" # add neighborhood column back to dataframe\n",
" onehot.insert(0, 'Neighborhood', df_venues['Neighborhood'].values) \n",
"\n",
" # creating dataset of onehot categories means\n",
" df_grouped = onehot.groupby('Neighborhood').mean().reset_index()\n",
"\n",
" # droping neighborhood with less than 8 venues to avoid outliers\n",
" min_venues_mask = df_venues.groupby('Neighborhood').count()['Venue']>=8 \n",
" df_grouped = df_grouped[min_venues_mask.values]\n",
"\n",
" df_merged = df\n",
"\n",
" # merge df with bh_food_grouped to add latitude/longitude for each neighborhood\n",
" df_merged = df_merged.join(df_grouped.set_index('Neighborhood'), on='Neighborhood')\n",
"\n",
" df_merged.dropna(inplace=True) \n",
" return df_merged.drop(['Latitude', 'Longitude', 'Neighborhood'], 1)\n",
"\n",
"\n",
"def build_evaluate(X, y):\n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=4)\n",
"\n",
" LR = LogisticRegression(C=0.1, solver='liblinear', multi_class='auto').fit(X_train, y_train)\n",
" yhat_lr = LR.predict(X_test)\n",
" yhat_lr_prob = LR.predict_proba(X_test)\n",
"\n",
" print(' Logistic regression accuracy score', metrics.accuracy_score(y_test, yhat_lr))\n",
" print(' Logistic regression log loss', metrics.log_loss(y_test, yhat_lr_prob))\n",
"\n",
" Ks = 10\n",
" mean_acc = np.zeros((Ks-1))\n",
" std_acc = np.zeros((Ks-1))\n",
" ConfustionMx = [];\n",
" for n in range(1,Ks):\n",
"\n",
" #Train Model and Predict \n",
" neigh = KNeighborsClassifier(n_neighbors = n).fit(X_train,y_train)\n",
" yhat=neigh.predict(X_test)\n",
" mean_acc[n-1] = metrics.accuracy_score(y_test, yhat)\n",
"\n",
"\n",
" std_acc[n-1]=np.std(yhat==y_test)/np.sqrt(yhat.shape[0])\n",
"\n",
" print(\" KNN accuracy score\", mean_acc.max(), \" with k=\", mean_acc.argmax()+1)\n",
" \n",
" clf = svm.SVC(kernel='rbf', gamma='auto')\n",
" clf.fit(X_train, y_train) \n",
"\n",
" yhat_svm = clf.predict(X_test)\n",
" print(\" SVM accuracy score\", metrics.accuracy_score(y_test, yhat_svm)) "
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Class</th>\n",
" <th>Acai House</th>\n",
" <th>American Restaurant</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Baiano Restaurant</th>\n",
" <th>...</th>\n",
" <th>Soup Place</th>\n",
" <th>South American Restaurant</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Steakhouse</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Syrian Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Wings Joint</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>low</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.090909</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>low</td>\n",
" <td>0.041667</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.041667</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>low</td>\n",
" <td>0.050000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.100000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>low</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.052632</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.157895</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>low</td>\n",
" <td>0.055556</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.055556</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>240</th>\n",
" <td>luxury</td>\n",
" <td>0.037037</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.074074</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.074074</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>241</th>\n",
" <td>luxury</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.011628</td>\n",
" <td>0.0</td>\n",
" <td>0.011628</td>\n",
" <td>0.0</td>\n",
" <td>0.011628</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.023256</td>\n",
" <td>0.011628</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.058140</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>242</th>\n",
" <td>luxury</td>\n",
" <td>0.058824</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.058824</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>243</th>\n",
" <td>luxury</td>\n",
" <td>0.022727</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.022727</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.022727</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.022727</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.045455</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>244</th>\n",
" <td>luxury</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>0.086957</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.043478</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>130 rows × 72 columns</p>\n",
"</div>"
],
"text/plain": [
" Class Acai House American Restaurant Arepa Restaurant \\\n",
"0 low 0.000000 0.0 0.0 \n",
"4 low 0.041667 0.0 0.0 \n",
"5 low 0.050000 0.0 0.0 \n",
"6 low 0.000000 0.0 0.0 \n",
"11 low 0.055556 0.0 0.0 \n",
".. ... ... ... ... \n",
"240 luxury 0.037037 0.0 0.0 \n",
"241 luxury 0.000000 0.0 0.0 \n",
"242 luxury 0.058824 0.0 0.0 \n",
"243 luxury 0.022727 0.0 0.0 \n",
"244 luxury 0.000000 0.0 0.0 \n",
"\n",
" Argentinian Restaurant Asian Restaurant Australian Restaurant \\\n",
"0 0.000000 0.000000 0.0 \n",
"4 0.000000 0.000000 0.0 \n",
"5 0.000000 0.000000 0.0 \n",
"6 0.000000 0.000000 0.0 \n",
"11 0.000000 0.000000 0.0 \n",
".. ... ... ... \n",
"240 0.000000 0.000000 0.0 \n",
"241 0.000000 0.011628 0.0 \n",
"242 0.000000 0.000000 0.0 \n",
"243 0.022727 0.000000 0.0 \n",
"244 0.000000 0.000000 0.0 \n",
"\n",
" BBQ Joint Bagel Shop Baiano Restaurant ... Soup Place \\\n",
"0 0.090909 0.0 0.000000 ... 0.0 \n",
"4 0.000000 0.0 0.000000 ... 0.0 \n",
"5 0.100000 0.0 0.000000 ... 0.0 \n",
"6 0.052632 0.0 0.000000 ... 0.0 \n",
"11 0.000000 0.0 0.000000 ... 0.0 \n",
".. ... ... ... ... ... \n",
"240 0.074074 0.0 0.000000 ... 0.0 \n",
"241 0.011628 0.0 0.011628 ... 0.0 \n",
"242 0.000000 0.0 0.000000 ... 0.0 \n",
"243 0.000000 0.0 0.022727 ... 0.0 \n",
"244 0.086957 0.0 0.000000 ... 0.0 \n",
"\n",
" South American Restaurant Spanish Restaurant Steakhouse \\\n",
"0 0.0 0.0 0.000000 \n",
"4 0.0 0.0 0.041667 \n",
"5 0.0 0.0 0.000000 \n",
"6 0.0 0.0 0.157895 \n",
"11 0.0 0.0 0.055556 \n",
".. ... ... ... \n",
"240 0.0 0.0 0.000000 \n",
"241 0.0 0.0 0.023256 \n",
"242 0.0 0.0 0.058824 \n",
"243 0.0 0.0 0.000000 \n",
"244 0.0 0.0 0.000000 \n",
"\n",
" Sushi Restaurant Syrian Restaurant Taco Place Tapas Restaurant \\\n",
"0 0.000000 0.0 0.0 0.0 \n",
"4 0.000000 0.0 0.0 0.0 \n",
"5 0.000000 0.0 0.0 0.0 \n",
"6 0.000000 0.0 0.0 0.0 \n",
"11 0.000000 0.0 0.0 0.0 \n",
".. ... ... ... ... \n",
"240 0.000000 0.0 0.0 0.0 \n",
"241 0.011628 0.0 0.0 0.0 \n",
"242 0.000000 0.0 0.0 0.0 \n",
"243 0.022727 0.0 0.0 0.0 \n",
"244 0.043478 0.0 0.0 0.0 \n",
"\n",
" Vegetarian / Vegan Restaurant Wings Joint \n",
"0 0.000000 0.0 \n",
"4 0.000000 0.0 \n",
"5 0.000000 0.0 \n",
"6 0.000000 0.0 \n",
"11 0.000000 0.0 \n",
".. ... ... \n",
"240 0.074074 0.0 \n",
"241 0.058140 0.0 \n",
"242 0.000000 0.0 \n",
"243 0.045455 0.0 \n",
"244 0.000000 0.0 \n",
"\n",
"[130 rows x 72 columns]"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bh_food_venues = pd.read_csv('bh_food_venues.csv')\n",
"bh_pro_venues = pd.read_csv('bh_pro_venues.csv')\n",
"prepare(bh_all_venues)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"### all venues category dataset ###\n",
" ### Actual class ###\n",
" Logistic regression accuracy score 0.6923076923076923\n",
" Logistic regression log loss 1.1909560870176388\n",
" KNN accuracy score 0.5769230769230769 with k= 8\n",
" SVM accuracy score 0.6923076923076923\n",
" ### if y == 'low' ###\n",
" Logistic regression accuracy score 0.9230769230769231\n",
" Logistic regression log loss 0.40203381145443345\n",
" KNN accuracy score 0.9230769230769231 with k= 6\n",
" SVM accuracy score 0.9230769230769231\n",
" ### if y == 'regular' ###\n",
" Logistic regression accuracy score 0.3076923076923077\n",
" Logistic regression log loss 0.7406334499138543\n",
" KNN accuracy score 0.6538461538461539 with k= 1\n",
" SVM accuracy score 0.3076923076923077\n",
" ### if y == 'high' ###\n",
" Logistic regression accuracy score 0.9615384615384616\n",
" Logistic regression log loss 0.34060287134407913\n",
" KNN accuracy score 1.0 with k= 1\n",
" SVM accuracy score 0.9615384615384616\n",
" ### if y == 'luxury' ###\n",
" Logistic regression accuracy score 0.8076923076923077\n",
" Logistic regression log loss 0.5148135568320493\n",
" KNN accuracy score 0.8076923076923077 with k= 2\n",
" SVM accuracy score 0.8076923076923077\n",
"### food venues category dataset ###\n",
" ### Actual class ###\n",
" Logistic regression accuracy score 0.6923076923076923\n",
" Logistic regression log loss 1.1909560870176388\n",
" KNN accuracy score 0.5769230769230769 with k= 8\n",
" SVM accuracy score 0.6923076923076923\n",
" ### if y == 'low' ###\n",
" Logistic regression accuracy score 0.9230769230769231\n",
" Logistic regression log loss 0.40203381145443345\n",
" KNN accuracy score 0.9230769230769231 with k= 6\n",
" SVM accuracy score 0.9230769230769231\n",
" ### if y == 'regular' ###\n",
" Logistic regression accuracy score 0.3076923076923077\n",
" Logistic regression log loss 0.7406334499138543\n",
" KNN accuracy score 0.6538461538461539 with k= 1\n",
" SVM accuracy score 0.3076923076923077\n",
" ### if y == 'high' ###\n",
" Logistic regression accuracy score 0.9615384615384616\n",
" Logistic regression log loss 0.34060287134407913\n",
" KNN accuracy score 1.0 with k= 1\n",
" SVM accuracy score 0.9615384615384616\n",
" ### if y == 'luxury' ###\n",
" Logistic regression accuracy score 0.8076923076923077\n",
" Logistic regression log loss 0.5148135568320493\n",
" KNN accuracy score 0.8076923076923077 with k= 2\n",
" SVM accuracy score 0.8076923076923077\n",
"### professional venues category dataset ###\n",
" ### Actual class ###\n",
" Logistic regression accuracy score 0.5714285714285714\n",
" Logistic regression log loss 1.2284283597098578\n",
" KNN accuracy score 0.5357142857142857 with k= 2\n",
" SVM accuracy score 0.5714285714285714\n",
" ### if y == 'low' ###\n",
" Logistic regression accuracy score 0.8214285714285714\n",
" Logistic regression log loss 0.488417167619632\n",
" KNN accuracy score 0.8214285714285714 with k= 4\n",
" SVM accuracy score 0.8214285714285714\n",
" ### if y == 'regular' ###\n",
" Logistic regression accuracy score 0.42857142857142855\n",
" Logistic regression log loss 0.6960464112425366\n",
" KNN accuracy score 0.6785714285714286 with k= 5\n",
" SVM accuracy score 0.42857142857142855\n",
" ### if y == 'high' ###\n",
" Logistic regression accuracy score 0.8928571428571429\n",
" Logistic regression log loss 0.3983842504318268\n",
" KNN accuracy score 0.9285714285714286 with k= 2\n",
" SVM accuracy score 0.8928571428571429\n",
" ### if y == 'luxury' ###\n",
" Logistic regression accuracy score 0.8571428571428571\n",
" Logistic regression log loss 0.4717453131865441\n",
" KNN accuracy score 0.8571428571428571 with k= 2\n",
" SVM accuracy score 0.8571428571428571\n"
]
}
],
"source": [
"names = ['all', 'food', 'professional']\n",
"datasets = [bh_all_venues, bh_food_venues, bh_pro_venues]\n",
"\n",
"for name, df_venues in zip(names, datasets):\n",
" \n",
" print('### {} venues category dataset ###'.format(name))\n",
" \n",
" df_merged = prepare(df_venues)\n",
"\n",
" y = le.transform(df_merged['Class'].values)\n",
" y0 = y == 0\n",
" y1 = y == 1\n",
" y2 = y == 2\n",
" y3 = y == 3\n",
"\n",
" X = df_merged.drop('Class', 1)\n",
"\n",
" print(' ### Actual class ###')\n",
" build_evaluate(X, y)\n",
"\n",
" print(' ### if y == \\'low\\' ###')\n",
" build_evaluate(X, y0)\n",
"\n",
" print(' ### if y == \\'regular\\' ###')\n",
" build_evaluate(X, y1)\n",
"\n",
" print(' ### if y == \\'high\\' ###')\n",
" build_evaluate(X, y2)\n",
"\n",
" print(' ### if y == \\'luxury\\' ###')\n",
" build_evaluate(X, y3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. Results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As mentioned before, we built KNN, SVM and Logistic regression models, but we will show only the results obtained by Logistic regression, because it gets the better scores (jaccard index score) in most cases."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.1 All venue categories dataset scores"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* the actual class: 0.6666\n",
"* if the class == 'luxury': **0.9**\n",
"* if the class == 'high': 0.8666\n",
"* if the class == 'regular': 0.3333\n",
"* if the class == 'low': **0.9**\n",
"* if the class == 'high' or 'luxury': 0.7666"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.2 Food venue categories dataset scores"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* the actual class: 0.6923\n",
"* if the class == 'luxury': 0.8\n",
"* if the class == 'high': **0.96**\n",
"* if the class == 'regular': 0.3076\n",
"* if the class == 'low': **0.923**\n",
"* if the class == 'high' or 'luxury': 0.7692"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4.3 Professional venue categories dataset scores"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* the actual class: 0.5714\n",
"* if the class == 'luxury': 0.8571\n",
"* if the class == 'high': 0.8928\n",
"* if the class == 'regular': 0.4286\n",
"* if the class == 'low': 0.8214\n",
"* if the class == 'high' or 'luxury': 0.75"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 5. Discussion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's interesting to see that the food venue categories dataset got the best overall results but closely followed by the all categories which indicates that may be possible to combine two or more categories to get optimistic scores, as it's clear that there are categories that disturbs the score (see the professional venue categories dataset). \n",
"\n",
"Besides that, it's also interesting to see that the model built with foods venues categories dataset can predict the 'high' and 'low' class remarkably well, and definately could be used in a different city, similar to 'Belo Horizonte'. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 6. Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Even though we couldn't get a great model to predict the actual class of a Neighborhood, we could get interesting results on predicting the 'high' and 'low' classes using the Food categories dataset, and predicting 'luxury' and 'low' casses using the All categories dataset."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment