Skip to content

Instantly share code, notes, and snippets.

@jhconning
Created October 24, 2018 20:29
Show Gist options
  • Save jhconning/b274aa39d9b929faec483a41da413b85 to your computer and use it in GitHub Desktop.
Save jhconning/b274aa39d9b929faec483a41da413b85 to your computer and use it in GitHub Desktop.
E/GitHub/GeoPanLearn/traffic/Untitled2.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "## Geopandas and geospatial\n### Building geodataframes"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport geopandas as gpd\nimport folium \nimport fiona\n\nfrom shapely.geometry import Point\nimport matplotlib.pyplot as plt\n\nimport contextily as ctx",
"execution_count": 1,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import geopandas as gpd",
"execution_count": 2,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Data downloads\n\nDownloads:\n\n- [Leading Pedestrian Interval Signals](https://data.cityofnewyork.us/Transportation/VZV_Leading-Pedestrian-Interval-Signals/mqt5-ctec) In this shapefile locations are as latitude, longitude.\n\n- [2017-2018 School Locations](https://data.cityofnewyork.us/Education/2017-2018-School-Locations/p6h4-mpyy) In this CSV file locations are measured in feet.\n\n\nThe zipped shapefile can be read directly into a geodataframe."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### LPIS geodataframe\nEverything we need is already here. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lpis_g = gpd.GeoDataFrame.from_file(r'zip://VZV_Leading Pedestrian Interval Signals.zip')",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lpis_g.head(1)",
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 4,
"data": {
"text/plain": " cross_stre date_insta time_insta lat long \\\n0 Dreiser loop East 2018-08-01 00:00:00.000 40.878465 -73.828273 \n\n main_stree geometry \n0 Co-op City Blvd POINT (-73.82827338235253 40.87846542795222) ",
"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>cross_stre</th>\n <th>date_insta</th>\n <th>time_insta</th>\n <th>lat</th>\n <th>long</th>\n <th>main_stree</th>\n <th>geometry</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Dreiser loop East</td>\n <td>2018-08-01</td>\n <td>00:00:00.000</td>\n <td>40.878465</td>\n <td>-73.828273</td>\n <td>Co-op City Blvd</td>\n <td>POINT (-73.82827338235253 40.87846542795222)</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Convert string dates to datetime format and then reorder and rename columns"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lpis_g['lpis_install_date'] = pd.to_datetime(lpis_g['date_insta'])\nlpis_g = lpis_g[['main_stree','cross_stre', 'lpis_install_date','lat', 'long', 'geometry']] \nlpis_g.columns = ['main_street', 'cross_street', 'lpis_install_date','latitude', 'longitude', 'geometry']\nlpis_g.head(1)",
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 5,
"data": {
"text/plain": " main_street cross_street lpis_install_date latitude longitude \\\n0 Co-op City Blvd Dreiser loop East 2018-08-01 40.878465 -73.828273 \n\n geometry \n0 POINT (-73.82827338235253 40.87846542795222) ",
"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>main_street</th>\n <th>cross_street</th>\n <th>lpis_install_date</th>\n <th>latitude</th>\n <th>longitude</th>\n <th>geometry</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>Co-op City Blvd</td>\n <td>Dreiser loop East</td>\n <td>2018-08-01</td>\n <td>40.878465</td>\n <td>-73.828273</td>\n <td>POINT (-73.82827338235253 40.87846542795222)</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Schools geodataframe"
},
{
"metadata": {
"trusted": true,
"scrolled": true
},
"cell_type": "code",
"source": "s = pd.read_csv('2017_-_2018_School_Locations.csv')\ns.columns",
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 6,
"data": {
"text/plain": "Index(['FISCAL_YEAR', 'ATS SYSTEM CODE', 'LOCATION_CODE', 'LOCATION_NAME',\n 'BEDS NUMBER', 'MANAGED_BY_NAME', 'LOCATION_TYPE_DESCRIPTION',\n 'LOCATION_CATEGORY_DESCRIPTION', 'GRADES_TEXT', 'GRADES_FINAL_TEXT',\n 'OPEN_DATE', 'STATUS_DESCRIPTIONS', 'PRIMARY_BUILDING_CODE',\n 'PRIMARY_ADDRESS_LINE_1', 'STATE_CODE', 'X_COORDINATE', 'Y_COORDINATE',\n 'COMMUNITY_DISTRICT', 'COUNCIL_DISTRICT', 'CENSUS_TRACT',\n 'BOROUGH_BLOCK_LOT', 'NTA', 'NTA_NAME', 'PRINCIPAL_NAME',\n 'PRINCIPAL_TITLE', 'PRINCIPAL_PHONE_NUMBER', 'FAX_NUMBER',\n 'GEOGRAPHICAL_DISTRICT_CODE', 'ADMIN_DISTRICT_LOCATION_CODE',\n 'ADMINISTRATIVE_DISTRICT_NAME', 'COMMUNITY_SCHOOL_SUP_NAME',\n 'FIELD_SUPPORT_CENTER_NAME', 'FIELD_SUPPORT_CENTER_LEADER_NAME',\n 'SCHOOL_SUPPORT_TEAM_NAME', 'SCHOOL_SUPPORT_TEAM_LEADER_NAME',\n 'HIGHSCHOOL_NETWORK_LOCATION_CODE', 'HIGHSCHOOL_NETWORK_NAME',\n 'HIGHSCHOOL_NETWORK_SUPERINTENDENT', 'Location 1'],\n dtype='object')"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Let's keep and rename only the columns we need. Drop the one school with missing data."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools = pd.read_csv('2017_-_2018_School_Locations.csv')\nschools = schools[['LOCATION_NAME','Location 1','LOCATION_CATEGORY_DESCRIPTION','X_COORDINATE','Y_COORDINATE']]\nschools.columns = ['school_name','location','school_type', 'ft_lon', 'ft_lat']\nschools.dropna(inplace = True)\nschools.head(1)",
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 7,
"data": {
"text/plain": " school_name \\\n0 P.S. 015 Roberto Clemente \n\n location school_type ft_lon \\\n0 333 EAST 4 STREET\\nMANHATTAN, NY 10009\\n(40.72... Elementary 990141.0 \n\n ft_lat \n0 202349.0 ",
"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>school_name</th>\n <th>location</th>\n <th>school_type</th>\n <th>ft_lon</th>\n <th>ft_lat</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>P.S. 015 Roberto Clemente</td>\n <td>333 EAST 4 STREET\\nMANHATTAN, NY 10009\\n(40.72...</td>\n <td>Elementary</td>\n <td>990141.0</td>\n <td>202349.0</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Note the `location` column is a string object but can be split to extract useful information. Let's do some regex magic to split things up. This will create a new dataframe with numbered columns. We'll further extract the lat longitude info from the last of these)."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "split1 = schools['location'].str.split(r'\\n()', expand=True)\nschools.drop(columns='location', inplace=True)\nsplit1.head(1)",
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 8,
"data": {
"text/plain": " 0 1 2 3 4\n0 333 EAST 4 STREET MANHATTAN, NY 10009 (40.722075, -73.978747)",
"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>0</th>\n <th>1</th>\n <th>2</th>\n <th>3</th>\n <th>4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>333 EAST 4 STREET</td>\n <td></td>\n <td>MANHATTAN, NY 10009</td>\n <td></td>\n <td>(40.722075, -73.978747)</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools[['address1','address2']] = split1[[0,2]]",
"execution_count": 9,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools[['latitude','longitude']] = split1[4].str.split('[(,)]',expand=True)[[1,2]].astype('float64')",
"execution_count": 10,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Drop any school with zero latitude or longitude (there's one in the dataset)"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools = schools[schools.latitude>40]",
"execution_count": 11,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We don't yet have a geometry to turn this into a geodataframe. The function below will do that."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def makegeo(df, latcol, loncol):\n df['Coordinates'] = list(zip(loncol, latcol))\n df['Coordinates'] = df['Coordinates'].apply(Point)\n return gpd.GeoDataFrame(df, geometry='Coordinates')",
"execution_count": 12,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools = makegeo(schools, schools.latitude, schools.longitude)",
"execution_count": 13,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools.head(1)",
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 14,
"data": {
"text/plain": " school_name school_type ft_lon ft_lat \\\n0 P.S. 015 Roberto Clemente Elementary 990141.0 202349.0 \n\n address1 address2 latitude longitude \\\n0 333 EAST 4 STREET MANHATTAN, NY 10009 40.722075 -73.978747 \n\n Coordinates \n0 POINT (-73.978747 40.722075) ",
"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>school_name</th>\n <th>school_type</th>\n <th>ft_lon</th>\n <th>ft_lat</th>\n <th>address1</th>\n <th>address2</th>\n <th>latitude</th>\n <th>longitude</th>\n <th>Coordinates</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>P.S. 015 Roberto Clemente</td>\n <td>Elementary</td>\n <td>990141.0</td>\n <td>202349.0</td>\n <td>333 EAST 4 STREET</td>\n <td>MANHATTAN, NY 10009</td>\n <td>40.722075</td>\n <td>-73.978747</td>\n <td>POINT (-73.978747 40.722075)</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The street map tiles are provided in Web Mercator EPSG 3857 so we need to convert"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools.crs = fiona.crs.from_epsg(4326)\nschools = schools.to_crs(epsg=3857)",
"execution_count": 15,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lpis_g.crs\nlpis_g = lpis_g.to_crs(epsg=3857)",
"execution_count": 16,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools.head(1)",
"execution_count": 17,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 17,
"data": {
"text/plain": " school_name school_type ft_lon ft_lat \\\n0 P.S. 015 Roberto Clemente Elementary 990141.0 202349.0 \n\n address1 address2 latitude longitude \\\n0 333 EAST 4 STREET MANHATTAN, NY 10009 40.722075 -73.978747 \n\n Coordinates \n0 POINT (-8235276.445564414 4971433.816188113) ",
"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>school_name</th>\n <th>school_type</th>\n <th>ft_lon</th>\n <th>ft_lat</th>\n <th>address1</th>\n <th>address2</th>\n <th>latitude</th>\n <th>longitude</th>\n <th>Coordinates</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>P.S. 015 Roberto Clemente</td>\n <td>Elementary</td>\n <td>990141.0</td>\n <td>202349.0</td>\n <td>333 EAST 4 STREET</td>\n <td>MANHATTAN, NY 10009</td>\n <td>40.722075</td>\n <td>-73.978747</td>\n <td>POINT (-8235276.445564414 4971433.816188113)</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Bounding box: Jackson Heights\n\nTo explore things slowly, let's start by focusing on a small subset of the city: the neighborhood of Jackson Heights.\n\nThe clip function returns a dataframe with only observations that fall within the a bounding box.\n"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "bounds = [-73.8987, -73.8701, 40.7470, 40.7600]\n\ndef clip(gdf, bd=bounds):\n return ( (gdf.longitude > bd[0]) & (gdf.longitude < bd[1]) & (gdf.latitude > bd[2]) & (gdf.latitude < bd[3]) )",
"execution_count": 18,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "jhschools = schools[clip(schools)]\njhlpis = lpis_g[clip(lpis_g)]\njhschools.shape, jhlpis.shape",
"execution_count": 19,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 19,
"data": {
"text/plain": "((11, 9), (106, 6))"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "This just creates an 'ID' variable "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "jhlpis['ID'] = np.arange(jhlpis.shape[0])+1",
"execution_count": 20,
"outputs": [
{
"output_type": "stream",
"text": "C:\\Users\\jconning\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:1: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n if __name__ == '__main__':\n",
"name": "stderr"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Create an LPIS 'ID'"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "jhlpis.head(1)",
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 21,
"data": {
"text/plain": " main_street cross_street lpis_install_date latitude \\\n259 Roosevelt Avenue 86 Street & Elbertson St 2018-06-02 40.748025 \n\n longitude geometry ID \n259 -73.880205 POINT (-8224306.767478551 4975246.140238575) 1 ",
"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>main_street</th>\n <th>cross_street</th>\n <th>lpis_install_date</th>\n <th>latitude</th>\n <th>longitude</th>\n <th>geometry</th>\n <th>ID</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>259</th>\n <td>Roosevelt Avenue</td>\n <td>86 Street &amp; Elbertson St</td>\n <td>2018-06-02</td>\n <td>40.748025</td>\n <td>-73.880205</td>\n <td>POINT (-8224306.767478551 4975246.140238575)</td>\n <td>1</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Geospatial analysis"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from geopandas.tools import sjoin",
"execution_count": 22,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Find distances from LPIS to nearest school"
},
{
"metadata": {
"trusted": true,
"scrolled": true
},
"cell_type": "code",
"source": "def school_dist(point):\n return jhschools.geometry.distance(point).min()\n\njhlpis['dist_school'] = jhlpis.geometry.apply(lambda x: school_dist(x))",
"execution_count": 23,
"outputs": [
{
"output_type": "stream",
"text": "C:\\Users\\jconning\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\ipykernel\\__main__.py:4: SettingWithCopyWarning: \nA value is trying to be set on a copy of a slice from a DataFrame.\nTry using .loc[row_indexer,col_indexer] = value instead\n\nSee the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
"name": "stderr"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Plot the map with icons indicating distance to nearest school."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "map = folium.Map(location=[40.7535, -73.8844], zoom_start =15, tiles='OpenStreetMap')\n\nfor idx, row in jhschools.iterrows():\n folium.Marker(location=[row.latitude, row.longitude],\n popup=f'{row.school_name}'\n ).add_to(map)\n \nfor idx, row in jhlpis.iterrows():\n folium.CircleMarker(location=[row.latitude, row.longitude],\n radius=5,\n popup=folium.Popup(f\"{row.ID} ({row.dist_school:.0f} ft) \", parse_html=True)\n ).add_to(map)\n\nmap.save('jh.html')\nmap",
"execution_count": 24,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 24,
"data": {
"text/plain": "<folium.folium.Map at 0x212c1d3bd30>",
"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+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSA9IEwubWFwKAogICAgICAgICdtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjknLCB7CiAgICAgICAgY2VudGVyOiBbNDAuNzUzNSwgLTczLjg4NDRdLAogICAgICAgIHpvb206IDE1LAogICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgIGxheWVyczogW10sCiAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICB9KTsKCiAgICAKICAgIAogICAgdmFyIHRpbGVfbGF5ZXJfODc5MzM0M2VlYzM4NDgzYjkwODAxMGYwNTUzODA1MmEgPSBMLnRpbGVMYXllcigKICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgIHsKICAgICAgICAiYXR0cmlidXRpb24iOiBudWxsLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAic3ViZG9tYWlucyI6ICJhYmMiCn0pLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAKICAgICAgICB2YXIgbWFya2VyXzk2YzY5N2MzMmJkZTQxMWU5NmNlZjFiMTFmNmQyNTY1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NDg4MDQsIC03My44ODg0NTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzMTE0ODVjNzIxNzRlODhiMzIzNzRhYWY0ZDIzNDBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJjMDZhYzIwNWUwNGI1ODg2NzJlYmU4MWE5YzFmYmYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiYzA2YWMyMDVlMDRiNTg4NjcyZWJlODFhOWMxZmJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QLlMuIDA2OSBKYWNrc29uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzMTE0ODVjNzIxNzRlODhiMzIzNzRhYWY0ZDIzNDBhLnNldENvbnRlbnQoaHRtbF9mYmMwNmFjMjA1ZTA0YjU4ODY3MmViZTgxYTljMWZiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk2YzY5N2MzMmJkZTQxMWU5NmNlZjFiMTFmNmQyNTY1LmJpbmRQb3B1cChwb3B1cF9hMzExNDg1YzcyMTc0ZTg4YjMyMzc0YWFmNGQyMzQwYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzJiYzMyYjdiY2E0MzRmNTFiZWM4M2FkNmUzMjc4MjIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NTQzODksIC03My44ODc1MjNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4MjRmNDQwYjE5ZDQ3MTM5ZWRiMDgwNzg2YWUxMTI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2NhMmVhYjZhNTgzNDEwOTk0NjhkNGM5Mzk3YzMxNTQgPSAkKCc8ZGl2IGlkPSJodG1sX2NjYTJlYWI2YTU4MzQxMDk5NDY4ZDRjOTM5N2MzMTU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JLlMuIDE0NSBKb3NlcGggUHVsaXR6ZXI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4MjRmNDQwYjE5ZDQ3MTM5ZWRiMDgwNzg2YWUxMTI4LnNldENvbnRlbnQoaHRtbF9jY2EyZWFiNmE1ODM0MTA5OTQ2OGQ0YzkzOTdjMzE1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJiYzMyYjdiY2E0MzRmNTFiZWM4M2FkNmUzMjc4MjIxLmJpbmRQb3B1cChwb3B1cF84ODI0ZjQ0MGIxOWQ0NzEzOWVkYjA4MDc4NmFlMTEyOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdkYzk5OTZiYmZhNzRlYTFhZTJlMDAxOTBlOGYwODliID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NTc2MjksIC03My44Nzg2MzhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlODhkMGVjZWQ5MjQ2YWZiZjgyN2E4MDFlZTE2MmViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGU3OTk2OTQ1MjBmNDUzM2FjYzkzYWY1ODllMGYwNjMgPSAkKCc8ZGl2IGlkPSJodG1sX2RlNzk5Njk0NTIwZjQ1MzNhY2M5M2FmNTg5ZTBmMDYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QLlMuIDE0OCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlODhkMGVjZWQ5MjQ2YWZiZjgyN2E4MDFlZTE2MmViLnNldENvbnRlbnQoaHRtbF9kZTc5OTY5NDUyMGY0NTMzYWNjOTNhZjU4OWUwZjA2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdkYzk5OTZiYmZhNzRlYTFhZTJlMDAxOTBlOGYwODliLmJpbmRQb3B1cChwb3B1cF84ZTg4ZDBlY2VkOTI0NmFmYmY4MjdhODAxZWUxNjJlYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA3ZWYwYTEzOWViYjQ1NjZhZWVjNWU4MTUyZjJlNTI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NTU3NTksIC03My44NzQ1MDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyODdlNWYyYmYyMzQzMThhNDcxMjUwMWQ1ODYxNDVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWI0YTc2MjkyM2NkNGNjY2FlYTY4ZGMwNDYyZTI0MWMgPSAkKCc8ZGl2IGlkPSJodG1sXzliNGE3NjI5MjNjZDRjY2NhZWE2OGRjMDQ2MmUyNDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QLlMuIDE0OSBDaHJpc3RhIE1jYXVsaWZmZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDI4N2U1ZjJiZjIzNDMxOGE0NzEyNTAxZDU4NjE0NWMuc2V0Q29udGVudChodG1sXzliNGE3NjI5MjNjZDRjY2NhZWE2OGRjMDQ2MmUyNDFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDdlZjBhMTM5ZWJiNDU2NmFlZWM1ZTgxNTJmMmU1MjkuYmluZFBvcHVwKHBvcHVwXzQyODdlNWYyYmYyMzQzMThhNDcxMjUwMWQ1ODYxNDVjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODYxYmIwZmE5ODFkNGIzNGFkYjRkMjIyODkyM2E1YTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjc1MzAzNSwgLTczLjg4NDQ1OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzlmZWE2ZmUzNjA3NGM3NzkzZTYwM2VkYjQ1MGQ5NjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZTkxNmI4ZWQwZjQ0MzA3YTFiZjZhYTljYzdjZDY0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGU5MTZiOGVkMGY0NDMwN2ExYmY2YWE5Y2M3Y2Q2NGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlAuUy4gMjEyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWZlYTZmZTM2MDc0Yzc3OTNlNjAzZWRiNDUwZDk2NS5zZXRDb250ZW50KGh0bWxfZGU5MTZiOGVkMGY0NDMwN2ExYmY2YWE5Y2M3Y2Q2NGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84NjFiYjBmYTk4MWQ0YjM0YWRiNGQyMjI4OTIzYTVhNy5iaW5kUG9wdXAocG9wdXBfMzlmZWE2ZmUzNjA3NGM3NzkzZTYwM2VkYjQ1MGQ5NjUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mOWNkM2E4Y2ViODU0NGE5OGUwZDA2MjM5ZWZiZGZiZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNzUwNDQyLCAtNzMuODc5OTkxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMzczOThhNjAxNmM0ODZmYTc2Mzc1NGZhYWYyZTg2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5OWVlNzhjZGEyMzQ5YTM4YWM3NWU3ZDIzMjQ0MzA3ID0gJCgnPGRpdiBpZD0iaHRtbF8wOTllZTc4Y2RhMjM0OWEzOGFjNzVlN2QyMzI0NDMwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UC5TLiBRMjIyIC0gRmlyZSBGaWdodGVyIENocmlzdG9waGVyIEEuIFNhbnRvcmEgU2M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzNzM5OGE2MDE2YzQ4NmZhNzYzNzU0ZmFhZjJlODY2LnNldENvbnRlbnQoaHRtbF8wOTllZTc4Y2RhMjM0OWEzOGFjNzVlN2QyMzI0NDMwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y5Y2QzYThjZWI4NTQ0YTk4ZTBkMDYyMzllZmJkZmJlLmJpbmRQb3B1cChwb3B1cF8wMzczOThhNjAxNmM0ODZmYTc2Mzc1NGZhYWYyZTg2NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2QzNTAwODJkYjcwZjQ0OTNhMGFhZmI1ZDMwYzA1NDQ5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NTc1NjcsIC03My44NzQ2MTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3MDM3NTAxMTk0MjRjZDJhMDRmMjE2NjdmODU2YTZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjg4NGJlOGM2MWQ4NDdlY2I1ODhmNWEwNWQ1MmRkY2MgPSAkKCc8ZGl2IGlkPSJodG1sX2I4ODRiZThjNjFkODQ3ZWNiNTg4ZjVhMDVkNTJkZGNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JLlMuIDIyNyBMb3VpcyBBcm1zdHJvbmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3MDM3NTAxMTk0MjRjZDJhMDRmMjE2NjdmODU2YTZiLnNldENvbnRlbnQoaHRtbF9iODg0YmU4YzYxZDg0N2VjYjU4OGY1YTA1ZDUyZGRjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QzNTAwODJkYjcwZjQ0OTNhMGFhZmI1ZDMwYzA1NDQ5LmJpbmRQb3B1cChwb3B1cF9jNzAzNzUwMTE5NDI0Y2QyYTA0ZjIxNjY3Zjg1NmE2YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzMxMDExNWRiNmFkNDQyZjlhZjYwZGQ2YTk0NTAxNWY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NTY5MzEsIC03My44NzQ5NDddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1MzNhZWJkMjY2NDQwMThhOGYyYTA4N2NhYWI1YTU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE2NGU2N2FhZGE5NDBjNjg5NzQ5NzllNzZkZTdiNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzFhNjRlNjdhYWRhOTQwYzY4OTc0OTc5ZTc2ZGU3YjcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QLlMuIDIyOCBFYXJseSBDaGlsZGhvb2QgTWFnbmV0IFNjaG9vbCBvZiB0aGUgQXJ0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjUzM2FlYmQyNjY0NDAxOGE4ZjJhMDg3Y2FhYjVhNTguc2V0Q29udGVudChodG1sXzFhNjRlNjdhYWRhOTQwYzY4OTc0OTc5ZTc2ZGU3YjcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzEwMTE1ZGI2YWQ0NDJmOWFmNjBkZDZhOTQ1MDE1ZjYuYmluZFBvcHVwKHBvcHVwX2I1MzNhZWJkMjY2NDQwMThhOGYyYTA4N2NhYWI1YTU4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmM0NjEwYTkyNWFjNGJjZjg4ZTY0NDA2ODAzMTU4NDggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjc1MjYxOCwgLTczLjg5Mjg4M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQwMzI3MWM4ZmY2NDZjYWExOWJjZjJkMzRlMDc1ZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZmFhNTIzMDQ4NWM0YzQ0YWI5ZWMxZWVhMWE4NjAzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmZhYTUyMzA0ODVjNGM0NGFiOWVjMWVlYTFhODYwMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkkuUy4gMjMwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDAzMjcxYzhmZjY0NmNhYTE5YmNmMmQzNGUwNzVmMi5zZXRDb250ZW50KGh0bWxfNmZhYTUyMzA0ODVjNGM0NGFiOWVjMWVlYTFhODYwMzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYzQ2MTBhOTI1YWM0YmNmODhlNjQ0MDY4MDMxNTg0OC5iaW5kUG9wdXAocG9wdXBfZTQwMzI3MWM4ZmY2NDZjYWExOWJjZjJkMzRlMDc1ZjIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zMmU2MGE4ZGNjMTI0ZmVhYWYyZGE4M2M2OWE1YjQ4NCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNzUzMzQ1LCAtNzMuODc0MTA5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOTQ3MmUyZGQ0NGU0M2Q4OTY0N2I2YWM4MzY1NDA2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FiMTk5MmQ3NjVjNDQzZjZiZTYwNzlmNGU4N2JlZGQxID0gJCgnPGRpdiBpZD0iaHRtbF9hYjE5OTJkNzY1YzQ0M2Y2YmU2MDc5ZjRlODdiZWRkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UC5TLiAyODA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y5NDcyZTJkZDQ0ZTQzZDg5NjQ3YjZhYzgzNjU0MDZlLnNldENvbnRlbnQoaHRtbF9hYjE5OTJkNzY1YzQ0M2Y2YmU2MDc5ZjRlODdiZWRkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMyZTYwYThkY2MxMjRmZWFhZjJkYTgzYzY5YTViNDg0LmJpbmRQb3B1cChwb3B1cF9mOTQ3MmUyZGQ0NGU0M2Q4OTY0N2I2YWM4MzY1NDA2ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA0MzFjMmE5ODU0ZTQwMGM5YWRhNGQ1MjA1NjliNjY0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC43NDk5MzQsIC03My44ODQ4MTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2ZDVhMjg2YmRmNzQyYTE4YjI4OTMxYTBiM2IzYjgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTk3ZWU1NWJmNjQ5NDcxYWJlNzgzNmFiYjNlMGNmMGYgPSAkKCc8ZGl2IGlkPSJodG1sX2E5N2VlNTViZjY0OTQ3MWFiZTc4MzZhYmIzZTBjZjBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZW5haXNzYW5jZSBDaGFydGVyIFNjaG9vbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTZkNWEyODZiZGY3NDJhMThiMjg5MzFhMGIzYjNiODIuc2V0Q29udGVudChodG1sX2E5N2VlNTViZjY0OTQ3MWFiZTc4MzZhYmIzZTBjZjBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDQzMWMyYTk4NTRlNDAwYzlhZGE0ZDUyMDU2OWI2NjQuYmluZFBvcHVwKHBvcHVwXzU2ZDVhMjg2YmRmNzQyYTE4YjI4OTMxYTBiM2IzYjgyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOGNmMDJmMTExOWM0YmE2YmU2MTVhMDMxNDNkNWYwNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODAyNDkyNDUsIC03My44ODAyMDQ3MDUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhZDc5MDEzMWQ5ZjRmM2E5NTY4MGYzMmM5MWY4ZDAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTU3MzkzOGUzMGZiNDYzN2JmMGFmZWIwOGQwZjFjN2UgPSAkKCc8ZGl2IGlkPSJodG1sX2E1NzM5MzhlMzBmYjQ2MzdiZjBhZmViMDhkMGYxYzdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4xICgzNTYgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhZDc5MDEzMWQ5ZjRmM2E5NTY4MGYzMmM5MWY4ZDAxLnNldENvbnRlbnQoaHRtbF9hNTczOTM4ZTMwZmI0NjM3YmYwYWZlYjA4ZDBmMWM3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOGNmMDJmMTExOWM0YmE2YmU2MTVhMDMxNDNkNWYwNC5iaW5kUG9wdXAocG9wdXBfMmFkNzkwMTMxZDlmNGYzYTk1NjgwZjMyYzkxZjhkMDEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwMWMzYmUwMjg5MDRiMWZiMGIyYTM0ODE1MDRjYjVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTE0MDUwMSwgLTczLjg3NTU1NTMyOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjJkMmRiMzMyYjg0NDNkYTg1OTk1MDk0Mjk5ODg3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwMTMwMjZiM2EyOTRhMjc5Y2VlZjFkOWEwMTZkN2I5ID0gJCgnPGRpdiBpZD0iaHRtbF9mMDEzMDI2YjNhMjk0YTI3OWNlZWYxZDlhMDE2ZDdiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MiAoNTY5ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjJkMmRiMzMyYjg0NDNkYTg1OTk1MDk0Mjk5ODg3ZS5zZXRDb250ZW50KGh0bWxfZjAxMzAyNmIzYTI5NGEyNzljZWVmMWQ5YTAxNmQ3YjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDAxYzNiZTAyODkwNGIxZmIwYjJhMzQ4MTUwNGNiNWYuYmluZFBvcHVwKHBvcHVwX2M2MmQyZGIzMzJiODQ0M2RhODU5OTUwOTQyOTk4ODdlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjUyMTRhYjgzOGM0NjQwYTFjY2I3ZjhkY2QzZTA1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODYxNDYwMzUsIC03My44NzQ2MzEyMTMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5OGFkNjA3OTIxZTQyYTU4ODUwZmQ2MGFhODE3Mzk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDVkYTU5NDIyMDJiNDc2ZmFhYTBjOGZiNTg2YWIzNmYgPSAkKCc8ZGl2IGlkPSJodG1sXzA1ZGE1OTQyMjAyYjQ3NmZhYWEwYzhmYjU4NmFiMzZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4zICg2NTQgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5OGFkNjA3OTIxZTQyYTU4ODUwZmQ2MGFhODE3Mzk1LnNldENvbnRlbnQoaHRtbF8wNWRhNTk0MjIwMmI0NzZmYWFhMGM4ZmI1ODZhYjM2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMjUyMTRhYjgzOGM0NjQwYTFjY2I3ZjhkY2QzZTA1NS5iaW5kUG9wdXAocG9wdXBfYzk4YWQ2MDc5MjFlNDJhNTg4NTBmZDYwYWE4MTczOTUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2MzUyZjI0YTFlNzQ1YTBiZGYyNTBkZTgxNGJhY2RjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4OTA1MjIxMywgLTczLjg3MTg0MDgyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDM3OTk5M2ExZTU3NDQ0ZDk5NTljN2EyNWZhYmE3NGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMjdlZWFlZDU4ODQ0ZTE4YTY1MjhiODM2ODM3YjBmNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjI3ZWVhZWQ1ODg0NGUxOGE2NTI4YjgzNjgzN2IwZjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQgKDcwMCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDM3OTk5M2ExZTU3NDQ0ZDk5NTljN2EyNWZhYmE3NGUuc2V0Q29udGVudChodG1sX2IyN2VlYWVkNTg4NDRlMThhNjUyOGI4MzY4MzdiMGY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2MzUyZjI0YTFlNzQ1YTBiZGYyNTBkZTgxNGJhY2RjLmJpbmRQb3B1cChwb3B1cF9kMzc5OTkzYTFlNTc0NDRkOTk1OWM3YTI1ZmFiYTc0ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2FjNDZhYzUzOTdlNDkyNDk1ZGY3MzFmNjEzYWZmYjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDc3Nzc1ODc0LCAtNzMuODgyNTY5MDcyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85Y2FjMmFjODc5MTY0MTI2YTM4NmFkY2JlMDY3MGQxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3NjIzMWNiM2JkMTQ1NTk4ZmJhNTRhOGI1YzU3Mjk1ID0gJCgnPGRpdiBpZD0iaHRtbF9lNzYyMzFjYjNiZDE0NTU5OGZiYTU0YThiNWM1NzI5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NSAoNDA0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Y2FjMmFjODc5MTY0MTI2YTM4NmFkY2JlMDY3MGQxYi5zZXRDb250ZW50KGh0bWxfZTc2MjMxY2IzYmQxNDU1OThmYmE1NGE4YjVjNTcyOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2FjNDZhYzUzOTdlNDkyNDk1ZGY3MzFmNjEzYWZmYjAuYmluZFBvcHVwKHBvcHVwXzljYWMyYWM4NzkxNjQxMjZhMzg2YWRjYmUwNjcwZDFiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNWQyZWY0YWJkMTM0NmQxYWRjNTg1NjdhYWJjN2RiYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTA2Mjc4MDUsIC03My44NzAzNzg4MzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhYjcyNmJkMWE2MDQ4ODdiYTk0ODZhMjhmNGNhZjI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQyODA1NTE3NjIyNDIyNWI4Y2RkNWY4ODBjNWNkYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzM0MjgwNTUxNzYyMjQyMjViOGNkZDVmODgwYzVjZGJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42ICg3NTQgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhYjcyNmJkMWE2MDQ4ODdiYTk0ODZhMjhmNGNhZjI1LnNldENvbnRlbnQoaHRtbF8zNDI4MDU1MTc2MjI0MjI1YjhjZGQ1Zjg4MGM1Y2RiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNWQyZWY0YWJkMTM0NmQxYWRjNTg1NjdhYWJjN2RiYS5iaW5kUG9wdXAocG9wdXBfMGFiNzI2YmQxYTYwNDg4N2JhOTQ4NmEyOGY0Y2FmMjUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzZWE2NjNmOWYyYTRmNjA4NWNiNGQwNzZkMWY5NjEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0Mzg5MzQ0NCwgLTczLjg5NjUyMjE4MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWMwYjQ0ZDAxYWZhNGZiMjk3OTFjYzAxNDg5ZDUwNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMzcxZWM3M2JmZWE0ZjJlYjI1ZDYzOGM0YjE5ZGVhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjM3MWVjNzNiZmVhNGYyZWIyNWQ2MzhjNGIxOWRlYTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjcgKDQ4MiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMwYjQ0ZDAxYWZhNGZiMjk3OTFjYzAxNDg5ZDUwNTQuc2V0Q29udGVudChodG1sX2YzNzFlYzczYmZlYTRmMmViMjVkNjM4YzRiMTlkZWEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzZWE2NjNmOWYyYTRmNjA4NWNiNGQwNzZkMWY5NjEwLmJpbmRQb3B1cChwb3B1cF9lYzBiNDRkMDFhZmE0ZmIyOTc5MWNjMDE0ODlkNTA1NCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjI0NGQyNWYwM2FhNDIyMzlhYzZhOWVjMzJhMmJiMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ0ODQ1NywgLTczLjg5NTU5MDgwOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTE4ZmQzYzUyZWU0OGE2OTUwYzBiMTNhOWMxMmM3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyN2YzMDY5NGYxOTQ3NThhNDQxYTMyYTQzMTUxYzRmID0gJCgnPGRpdiBpZD0iaHRtbF8yMjdmMzA2OTRmMTk0NzU4YTQ0MWEzMmE0MzE1MWM0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OCAoNDA4ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZTE4ZmQzYzUyZWU0OGE2OTUwYzBiMTNhOWMxMmM3MS5zZXRDb250ZW50KGh0bWxfMjI3ZjMwNjk0ZjE5NDc1OGE0NDFhMzJhNDMxNTFjNGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjI0NGQyNWYwM2FhNDIyMzlhYzZhOWVjMzJhMmJiMTIuYmluZFBvcHVwKHBvcHVwX2FlMThmZDNjNTJlZTQ4YTY5NTBjMGIxM2E5YzEyYzcxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZmZmZGZlMzNmYzg0YjIzYTQxNTI0MTE3NmRjMDhjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDU4MjUzMzYsIC03My44OTQ2NTk0MjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiMmNkMDM0Njc5YzQ1MzY4MDYxNjNlYTc1MjA0NWQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNlNDE1MGE4NDc2NDRjNmE4MGVmMWE0MzUzYjU5YmEgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjZTQxNTBhODQ3NjQ0YzZhODBlZjFhNDM1M2I1OWJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45ICgzNTAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZiMmNkMDM0Njc5YzQ1MzY4MDYxNjNlYTc1MjA0NWQxLnNldENvbnRlbnQoaHRtbF9mY2U0MTUwYTg0NzY0NGM2YTgwZWYxYTQzNTNiNTliYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZmZmZGZlMzNmYzg0YjIzYTQxNTI0MTE3NmRjMDhjYS5iaW5kUG9wdXAocG9wdXBfZmIyY2QwMzQ2NzljNDUzNjgwNjE2M2VhNzUyMDQ1ZDEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UyMjk2MmFiZTM5ODQyOTg5MjU0YTE4ZmVjYWFkMTBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NTM3NTA0OSwgLTczLjg3NjA2NzMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTk2ZmE1NzhmYjhiNGI2NzkzNDgyYTg1ZGQ0MjRhZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNWIwZjdjMjJiNDk0NGQ4OWQwM2RkNzE5MjQ2M2M4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTViMGY3YzIyYjQ5NDRkODlkMDNkZDcxOTI0NjNjOGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjEwICgxMzcgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5NmZhNTc4ZmI4YjRiNjc5MzQ4MmE4NWRkNDI0YWQ1LnNldENvbnRlbnQoaHRtbF9lNWIwZjdjMjJiNDk0NGQ4OWQwM2RkNzE5MjQ2M2M4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjI5NjJhYmUzOTg0Mjk4OTI1NGExOGZlY2FhZDEwYi5iaW5kUG9wdXAocG9wdXBfOTk2ZmE1NzhmYjhiNGI2NzkzNDgyYTg1ZGQ0MjRhZDUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjNzJjNDkyODU3NDRkNWU4ZGMyZmRjZjEwMDRhZjMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2OTQyMjY3NywgLTczLjg3MjIxODgwNThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTBkZjhkOGUyY2I1NDk3ODk4YWMzMzJjMTg0OTA1MjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMjQ5MjJiZDAxN2Q0ZDBjOWMwYzM4MDViNTgxNDkwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzI0OTIyYmQwMTdkNGQwYzljMGMzODA1YjU4MTQ5MDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjExICgyODIgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwZGY4ZDhlMmNiNTQ5Nzg5OGFjMzMyYzE4NDkwNTI1LnNldENvbnRlbnQoaHRtbF9jMjQ5MjJiZDAxN2Q0ZDBjOWMwYzM4MDViNTgxNDkwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYzcyYzQ5Mjg1NzQ0ZDVlOGRjMmZkY2YxMDA0YWYzMC5iaW5kUG9wdXAocG9wdXBfNTBkZjhkOGUyY2I1NDk3ODk4YWMzMzJjMTg0OTA1MjUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3NDc1ZjExYzIzYTRkNzk5NGMzOGI1ZGQ1Y2EyNzhjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU3MDM3MzM3LCAtNzMuODcxMzIzNDU3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTRjODY3YzQ4MTc0YzI4ODY1YWY3ZDEyMjhkZWYyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzYjY5ODRkNWJiZjQ5OWU5NzZjNDRjZDFhOWYzNjgzID0gJCgnPGRpdiBpZD0iaHRtbF9jM2I2OTg0ZDViYmY0OTllOTc2YzQ0Y2QxYTlmMzY4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTIgKDM3NCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWU0Yzg2N2M0ODE3NGMyODg2NWFmN2QxMjI4ZGVmMjYuc2V0Q29udGVudChodG1sX2MzYjY5ODRkNWJiZjQ5OWU5NzZjNDRjZDFhOWYzNjgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM3NDc1ZjExYzIzYTRkNzk5NGMzOGI1ZGQ1Y2EyNzhjLmJpbmRQb3B1cChwb3B1cF9hZTRjODY3YzQ4MTc0YzI4ODY1YWY3ZDEyMjhkZWYyNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDk1ZGY4ZWQyZjg5NGM0MzhjMTMwOTM2YTY5NmU2N2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTcxMzIzODMyLCAtNzMuODcwNDEzNjY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDM2NGZkMjFkNGY0NDg3YmQ4MmQ4YjI2ZjMyNTIwNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExZGFkYWI4NzM0ZDRkMmViMTU2YzU2MWY5MGY5N2IyID0gJCgnPGRpdiBpZD0iaHRtbF8xMWRhZGFiODczNGQ0ZDJlYjE1NmM1NjFmOTBmOTdiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTMgKDQ3MiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAzNjRmZDIxZDRmNDQ4N2JkODJkOGIyNmYzMjUyMDUuc2V0Q29udGVudChodG1sXzExZGFkYWI4NzM0ZDRkMmViMTU2YzU2MWY5MGY5N2IyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5NWRmOGVkMmY4OTRjNDM4YzEzMDkzNmE2OTZlNjdmLmJpbmRQb3B1cChwb3B1cF8zMDM2NGZkMjFkNGY0NDg3YmQ4MmQ4YjI2ZjMyNTIwNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDhlODI3MTM5NmZkNDlkOWFkZWNiYzZiY2FhNTAzNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTgwNzI1OTQyLCAtNzMuODgyMDM0NzQ5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ODVkZTJmOWExOWY0YzRiYmIzY2E5MGJmMGQwYjQ1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyMmNhMmU5OGI0ODQ5MmFiODBiMmQ0MTUyM2I5OTM4ID0gJCgnPGRpdiBpZD0iaHRtbF9mMjJjYTJlOThiNDg0OTJhYjgwYjJkNDE1MjNiOTkzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTQgKDM4NCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODg1ZGUyZjlhMTlmNGM0YmJiM2NhOTBiZjBkMGI0NTcuc2V0Q29udGVudChodG1sX2YyMmNhMmU5OGI0ODQ5MmFiODBiMmQ0MTUyM2I5OTM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q4ZTgyNzEzOTZmZDQ5ZDlhZGVjYmM2YmNhYTUwMzZkLmJpbmRQb3B1cChwb3B1cF84ODVkZTJmOWExOWY0YzRiYmIzY2E5MGJmMGQwYjQ1NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGE5M2UzNmQ3ZGVmNDkwNDg4MmQyNGE2NDljOTY3ZjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ4OTY0Nzk1LCAtNzMuODczODc4MDMzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NmU4YTIyZmIwY2Y0MDgwYmM0MDNiNGZhYjU3OTIyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0NDRjNGVjMGQ3MzQ3Nzg4ZjRkMzIwZTZlZDhiMTZhID0gJCgnPGRpdiBpZD0iaHRtbF83NDQ0YzRlYzBkNzM0Nzc4OGY0ZDMyMGU2ZWQ4YjE2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTUgKDE0NSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODZlOGEyMmZiMGNmNDA4MGJjNDAzYjRmYWI1NzkyMmEuc2V0Q29udGVudChodG1sXzc0NDRjNGVjMGQ3MzQ3Nzg4ZjRkMzIwZTZlZDhiMTZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhOTNlMzZkN2RlZjQ5MDQ4ODJkMjRhNjQ5Yzk2N2YyLmJpbmRQb3B1cChwb3B1cF84NmU4YTIyZmIwY2Y0MDgwYmM0MDNiNGZhYjU3OTIyYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRjYjQ3NzNjMDVkNDlmZGExYTM0NWE0M2M4YTlkYjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ3OTg2ODQ3LCAtNzMuODc0ODA5NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2RiNzI4MzY0ZTcyNDVhNmE3ZTYzMjE1YmZlNDJhOGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MTM4OWMwZTAyZTg0YzU3OWQ5OGU0ZWUzNmVkZjVjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfODEzODljMGUwMmU4NGM1NzlkOThlNGVlMzZlZGY1Y2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjE2ICgxNDUgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkYjcyODM2NGU3MjQ1YTZhN2U2MzIxNWJmZTQyYThhLnNldENvbnRlbnQoaHRtbF84MTM4OWMwZTAyZTg0YzU3OWQ5OGU0ZWUzNmVkZjVjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZGNiNDc3M2MwNWQ0OWZkYTFhMzQ1YTQzYzhhOWRiMi5iaW5kUG9wdXAocG9wdXBfM2RiNzI4MzY0ZTcyNDVhNmE3ZTYzMjE1YmZlNDJhOGEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk5ZDMyOTJjZGU2MTQ3ZTVhZTlmZTJjYWM4MDkyNzFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ3MDI5NjczNiwgLTczLjg4OTU3MDQyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjEwM2ExNWZlY2UwNDg5OGExYWVhM2VkZGQ2OWNmZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OTAzYmEzN2I5ZDg0OWUyYTE1MWJlOTJkM2U3ZjcxNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDkwM2JhMzdiOWQ4NDllMmExNTFiZTkyZDNlN2Y3MTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjE3ICgyODkgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxMDNhMTVmZWNlMDQ4OThhMWFlYTNlZGRkNjljZmYwLnNldENvbnRlbnQoaHRtbF80OTAzYmEzN2I5ZDg0OWUyYTE1MWJlOTJkM2U3ZjcxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OWQzMjkyY2RlNjE0N2U1YWU5ZmUyY2FjODA5MjcxZC5iaW5kUG9wdXAocG9wdXBfNjEwM2ExNWZlY2UwNDg5OGExYWVhM2VkZGQ2OWNmZjApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4ZDkyNTNmMGQ0ZjQ0NDk5ZmRiZDViYzQyNGE5ZDZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ3MzM0MzEzMSwgLTczLjg4NjcxNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Y2YzZmEyODUxYmY0NWNmOGMzOGQzZGYxZDFkNWM5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlYjhkOGUwY2MyNDQwMTJiMGQ2MzUxZjUwOTY2YzVjID0gJCgnPGRpdiBpZD0iaHRtbF8yZWI4ZDhlMGNjMjQ0MDEyYjBkNjM1MWY1MDk2NmM1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTggKDI5MCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmNmM2ZhMjg1MWJmNDVjZjhjMzhkM2RmMWQxZDVjOTIuc2V0Q29udGVudChodG1sXzJlYjhkOGUwY2MyNDQwMTJiMGQ2MzUxZjUwOTY2YzVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4ZDkyNTNmMGQ0ZjQ0NDk5ZmRiZDViYzQyNGE5ZDZlLmJpbmRQb3B1cChwb3B1cF82Y2YzZmEyODUxYmY0NWNmOGMzOGQzZGYxZDFkNWM5MikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzlhNDJlOTBjZThmNGQ4OWFkOTc5YWVmY2E3MGY2ZmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDc0MzIyMDc4LCAtNzMuODg1Nzg3NTAyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lODdkZWJlZDgyNTQ0MjZiOGM4NWNlZTFjMDc1N2Q1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMWMzODE5ZTAyYzQ3ODQ4OTZmZGU0N2M1ZDNlMzdiID0gJCgnPGRpdiBpZD0iaHRtbF9mYzFjMzgxOWUwMmM0Nzg0ODk2ZmRlNDdjNWQzZTM3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTkgKDM1OSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTg3ZGViZWQ4MjU0NDI2YjhjODVjZWUxYzA3NTdkNWIuc2V0Q29udGVudChodG1sX2ZjMWMzODE5ZTAyYzQ3ODQ4OTZmZGU0N2M1ZDNlMzdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5YTQyZTkwY2U4ZjRkODlhZDk3OWFlZmNhNzBmNmZkLmJpbmRQb3B1cChwb3B1cF9lODdkZWJlZDgyNTQ0MjZiOGM4NWNlZTFjMDc1N2Q1YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDRiNjJkZTQxZDQ1NDI3ZTk3NjgzYTVjZTA2ODFlNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDc1MjczNDMsIC03My44ODQ4NTI2MDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhNmRhOGU2MmYyYjRmNjJhY2NkM2QzNGMzNDA2MjM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjZkZWU5MjYzZTM1NGZmOTg1NjU3ODgyODQwYzJhOTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2ZGVlOTI2M2UzNTRmZjk4NTY1Nzg4Mjg0MGMyYTk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yMCAoMzU0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTZkYThlNjJmMmI0ZjYyYWNjZDNkMzRjMzQwNjIzOS5zZXRDb250ZW50KGh0bWxfZjZkZWU5MjYzZTM1NGZmOTg1NjU3ODgyODQwYzJhOTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDRiNjJkZTQxZDQ1NDI3ZTk3NjgzYTVjZTA2ODFlNWIuYmluZFBvcHVwKHBvcHVwXzVhNmRhOGU2MmYyYjRmNjJhY2NkM2QzNGMzNDA2MjM5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ODdkZDI2OTVjMjQ0MjExYjY1M2E1ZTZjOTE2YWU3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NzYyMjQ4ODksIC03My44ODM5MzU3NDMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY4ZDgzZjQxMDA4YjQyNmQ4OWUxYjQ2NWU0ZTZlZmVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTE5MDliNzQ4Zjc4NGY2ZDhiMjA1M2E2YWZiMjI3MTUgPSAkKCc8ZGl2IGlkPSJodG1sXzExOTA5Yjc0OGY3ODRmNmQ4YjIwNTNhNmFmYjIyNzE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yMSAoMzU0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGQ4M2Y0MTAwOGI0MjZkODllMWI0NjVlNGU2ZWZlYy5zZXRDb250ZW50KGh0bWxfMTE5MDliNzQ4Zjc4NGY2ZDhiMjA1M2E2YWZiMjI3MTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODg3ZGQyNjk1YzI0NDIxMWI2NTNhNWU2YzkxNmFlN2EuYmluZFBvcHVwKHBvcHVwXzY4ZDgzZjQxMDA4YjQyNmQ4OWUxYjQ2NWU0ZTZlZmVjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjc0M2EwYWYzZmQ0Yjk5YWY2Mzc2NWJkMTUzNzZjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NzcyNTgzOTcsIC03My44ODI5OTcyMTI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyNDA5YmIzZjg3NjQ5OGNhNmMyOTdlMjRkYzI3ZmUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQ5YjIzMWRmZmIyNGU0ZWIxZDRiMGYzZDY3MzYxNWQgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0OWIyMzFkZmZiMjRlNGViMWQ0YjBmM2Q2NzM2MTVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yMiAoMzgzICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjQwOWJiM2Y4NzY0OThjYTZjMjk3ZTI0ZGMyN2ZlMC5zZXRDb250ZW50KGh0bWxfNDQ5YjIzMWRmZmIyNGU0ZWIxZDRiMGYzZDY3MzYxNWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWI3NDNhMGFmM2ZkNGI5OWFmNjM3NjViZDE1Mzc2YzcuYmluZFBvcHVwKHBvcHVwX2QyNDA5YmIzZjg3NjQ5OGNhNmMyOTdlMjRkYzI3ZmUwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYjMyODc0ZWY0YmY0ZWU1YWY2NjBkMjg4OGZmZWE0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NzgyMDk2MDYsIC03My44ODIwNjk1MjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjZGM2YWRkOWRmYTRlNTA4M2Q4NWRjZmI5NjI4YzU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGFhYmE2NzU5MmNmNGI2N2FjNWY1ZmNlOWExYTc4YmIgPSAkKCc8ZGl2IGlkPSJodG1sX2RhYWJhNjc1OTJjZjRiNjdhYzVmNWZjZTlhMWE3OGJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yMyAoNDM2ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lY2RjNmFkZDlkZmE0ZTUwODNkODVkY2ZiOTYyOGM1NS5zZXRDb250ZW50KGh0bWxfZGFhYmE2NzU5MmNmNGI2N2FjNWY1ZmNlOWExYTc4YmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGIzMjg3NGVmNGJmNGVlNWFmNjYwZDI4ODhmZmVhNDguYmluZFBvcHVwKHBvcHVwX2VjZGM2YWRkOWRmYTRlNTA4M2Q4NWRjZmI5NjI4YzU1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NGM4ZTMyZDk1YzY0ZDQxOGFkYzkwMTFmZDk5ZWM4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1Mjg0MzkxMzYsIC03My44OTMzOTc0ODgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlNGM5YzgxYjE2ZTRhNzVhMTNmNGVkZjQ0ZjI5OWRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGM0NWI3NGYxYzk4NDI1YmJlNTY4YTdiM2QwZDE4ZTkgPSAkKCc8ZGl2IGlkPSJodG1sXzhjNDViNzRmMWM5ODQyNWJiZTU2OGE3YjNkMGQxOGU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4yNCAoNjYgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlNGM5YzgxYjE2ZTRhNzVhMTNmNGVkZjQ0ZjI5OWRjLnNldENvbnRlbnQoaHRtbF84YzQ1Yjc0ZjFjOTg0MjViYmU1NjhhN2IzZDBkMThlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NGM4ZTMyZDk1YzY0ZDQxOGFkYzkwMTFmZDk5ZWM4OS5iaW5kUG9wdXAocG9wdXBfZGU0YzljODFiMTZlNGE3NWExM2Y0ZWRmNDRmMjk5ZGMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwOWZhYjczNWMzODQ1NmM5OGIxODkxYjZkYzA2MTY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyOTM5MTIwNywgLTczLjg5MjQ3MzM0OTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYThkZTcyNTNkNjM4NGNlZmE2ZTExOWVlM2ZlMTk3NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTA3ZmZkYzVlMTc0NmQ0ODFhYzExYzFjNjViNjE2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTkwN2ZmZGM1ZTE3NDZkNDgxYWMxMWMxYzY1YjYxNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjI1ICg2NiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYThkZTcyNTNkNjM4NGNlZmE2ZTExOWVlM2ZlMTk3Nzguc2V0Q29udGVudChodG1sXzE5MDdmZmRjNWUxNzQ2ZDQ4MWFjMTFjMWM2NWI2MTY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwOWZhYjczNWMzODQ1NmM5OGIxODkxYjZkYzA2MTY2LmJpbmRQb3B1cChwb3B1cF9hOGRlNzI1M2Q2Mzg0Y2VmYTZlMTE5ZWUzZmUxOTc3OCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzQ2Yzg5NTJmMzI1NDZiNTllOGI3ZDIxMTRjNTlhY2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2NzIyMjU4LCAtNzMuODkzNzMzODQ2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTgyOTE3MGMyM2U0MDVkYjM3NjkwNmM4Y2Q1ODc2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhMGU2NzIxODYyNTQ5NDZhODc0ZTFhMjVhZTgzMmQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9jYTBlNjcyMTg2MjU0OTQ2YTg3NGUxYTI1YWU4MzJkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjYgKDMxNiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWE4MjkxNzBjMjNlNDA1ZGIzNzY5MDZjOGNkNTg3NjUuc2V0Q29udGVudChodG1sX2NhMGU2NzIxODYyNTQ5NDZhODc0ZTFhMjVhZTgzMmQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc0NmM4OTUyZjMyNTQ2YjU5ZThiN2QyMTE0YzU5YWNlLmJpbmRQb3B1cChwb3B1cF9hYTgyOTE3MGMyM2U0MDVkYjM3NjkwNmM4Y2Q1ODc2NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGMyMTViODI0NmFkNGQ2ZTk2Zjg1NGU0YTAwNWRiMmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ3NzAxNzM1LCAtNzMuODkyODAyNDYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDBjNTQzN2Y1YWQ0YTYzYjQ0MDg4OTdmYWI0OWVjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxMzE5Njg5MTk2ZTRlZjU4ZWQ1MzdiOWU1Mjc4OGQ1ID0gJCgnPGRpdiBpZD0iaHRtbF8zMTMxOTY4OTE5NmU0ZWY1OGVkNTM3YjllNTI3ODhkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjcgKDMxNiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQwYzU0MzdmNWFkNGE2M2I0NDA4ODk3ZmFiNDllY2Muc2V0Q29udGVudChodG1sXzMxMzE5Njg5MTk2ZTRlZjU4ZWQ1MzdiOWU1Mjc4OGQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjMjE1YjgyNDZhZDRkNmU5NmY4NTRlNGEwMDVkYjJhLmJpbmRQb3B1cChwb3B1cF9lNDBjNTQzN2Y1YWQ0YTYzYjQ0MDg4OTdmYWI0OWVjYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDg0M2M2NWU0MjcwNGRlNzgwMTliODQ0N2IzYmExMjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ5NjYwNTQyLCAtNzMuODkwOTQ2ODk4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGJmOTcwMzFiMmQ0YWIxOGJlYTMwMmZjZjk0NGQwYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmZjc3ZWI3MzNmNjQ4M2Q4NDM1ZWM4YjQxYmI2MmQ1ID0gJCgnPGRpdiBpZD0iaHRtbF9iZmY3N2ViNzMzZjY0ODNkODQzNWVjOGI0MWJiNjJkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjggKDM5MCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjBiZjk3MDMxYjJkNGFiMThiZWEzMDJmY2Y5NDRkMGIuc2V0Q29udGVudChodG1sX2JmZjc3ZWI3MzNmNjQ4M2Q4NDM1ZWM4YjQxYmI2MmQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA4NDNjNjVlNDI3MDRkZTc4MDE5Yjg0NDdiM2JhMTI2LmJpbmRQb3B1cChwb3B1cF9iMGJmOTcwMzFiMmQ0YWIxOGJlYTMwMmZjZjk0NGQwYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzE5NGQ1NmIyOTc2NDg3NmJhNDYyNDllMzAwZjVlZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTUwNjEyMzEyLCAtNzMuODkwMDExODk4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzQ2YzY0ZGExMmU0ZjQ3ODdlMGE2OTRjMWY2ZTQ3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhMTk0ZGYzZWMxYjQwM2FiNmUxZDQ3YTBjYjRhY2ZkID0gJCgnPGRpdiBpZD0iaHRtbF83YTE5NGRmM2VjMWI0MDNhYjZlMWQ0N2EwY2I0YWNmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MjkgKDI5NCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTM0NmM2NGRhMTJlNGY0Nzg3ZTBhNjk0YzFmNmU0NzEuc2V0Q29udGVudChodG1sXzdhMTk0ZGYzZWMxYjQwM2FiNmUxZDQ3YTBjYjRhY2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MxOTRkNTZiMjk3NjQ4NzZiYTQ2MjQ5ZTMwMGY1ZWU4LmJpbmRQb3B1cChwb3B1cF81MzQ2YzY0ZGExMmU0ZjQ3ODdlMGE2OTRjMWY2ZTQ3MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ0NTFhZDJlZmFhNDU1NTlmOWIwZDMzNTljMDczZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTU0NTI4NjgyLCAtNzMuODg2Mjk3MTIxNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wN2Y0M2NjYTBmYzk0NDVhYTQzMDQzNmJhYzI2YjM2MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjMmRhMmViOTY0YjQyNzk4NDdjYjEzMzhhMGIyYWUyID0gJCgnPGRpdiBpZD0iaHRtbF8xYzJkYTJlYjk2NGI0Mjc5ODQ3Y2IxMzM4YTBiMmFlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MzAgKDIwOCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDdmNDNjY2EwZmM5NDQ1YWE0MzA0MzZiYWMyNmIzNjMuc2V0Q29udGVudChodG1sXzFjMmRhMmViOTY0YjQyNzk4NDdjYjEzMzhhMGIyYWUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkNDUxYWQyZWZhYTQ1NTU5ZjliMGQzMzU5YzA3M2Y1LmJpbmRQb3B1cChwb3B1cF8wN2Y0M2NjYTBmYzk0NDVhYTQzMDQzNmJhYzI2YjM2MykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ViMWJhNDUzZTYzNDk2MTg4MmU2YTJlNzY4NzhmMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTU1NDgwMTEsIC03My44ODUzNjU3MTcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3YmY5ZmZhMTA1ZjRkYTg5NmQ1MGQ1MDJiYzA0MTBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDU5N2IzZWZhNDczNGQwOWEwZGNhM2ZlYjM4ZGY0OTEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1OTdiM2VmYTQ3MzRkMDlhMGRjYTNmZWIzOGRmNDkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4zMSAoMjk0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yN2JmOWZmYTEwNWY0ZGE4OTZkNTBkNTAyYmMwNDEwYi5zZXRDb250ZW50KGh0bWxfNDU5N2IzZWZhNDczNGQwOWEwZGNhM2ZlYjM4ZGY0OTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ViMWJhNDUzZTYzNDk2MTg4MmU2YTJlNzY4NzhmMTMuYmluZFBvcHVwKHBvcHVwXzI3YmY5ZmZhMTA1ZjRkYTg5NmQ1MGQ1MDJiYzA0MTBiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTE3ZGNkMGM2MjA0YWUxYjRkYjA2YjE2MWExMTVmZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NTY0ODYzOTUsIC03My44ODQ0Mzc5MTE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2ZTM5YzI1M2ZlMjRiOGRiMTZhMTc5YjYzZjcxOTU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGMzYzZkMjIyZGRkNDgwYzk4NTYyZTUwOTBlYTA1OWMgPSAkKCc8ZGl2IGlkPSJodG1sX2RjM2M2ZDIyMmRkZDQ4MGM5ODU2MmU1MDkwZWEwNTljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4zMiAoMzg0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NmUzOWMyNTNmZTI0YjhkYjE2YTE3OWI2M2Y3MTk1NS5zZXRDb250ZW50KGh0bWxfZGMzYzZkMjIyZGRkNDgwYzk4NTYyZTUwOTBlYTA1OWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjkxN2RjZDBjNjIwNGFlMWI0ZGIwNmIxNjFhMTE1ZmUuYmluZFBvcHVwKHBvcHVwXzg2ZTM5YzI1M2ZlMjRiOGRiMTZhMTc5YjYzZjcxOTU1KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYmFhOGEyYTNlMGI0ZWJhYWZmYzkyNmVhZmE0MDYxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NTc0NjUxMiwgLTczLjg4MzUwNjQ5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDJmZmYzYTZlYzQzNDA0MGE3NmQyZGE3YzAzZTc4MWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzE0N2UyMmFiZWM0MzUxOWZmNTEyY2ZkN2ExNjg1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjMxNDdlMjJhYmVjNDM1MTlmZjUxMmNmZDdhMTY4NWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjMzICg0MTIgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyZmZmM2E2ZWM0MzQwNDBhNzZkMmRhN2MwM2U3ODFhLnNldENvbnRlbnQoaHRtbF82MzE0N2UyMmFiZWM0MzUxOWZmNTEyY2ZkN2ExNjg1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYmFhOGEyYTNlMGI0ZWJhYWZmYzkyNmVhZmE0MDYxNi5iaW5kUG9wdXAocG9wdXBfMDJmZmYzYTZlYzQzNDA0MGE3NmQyZGE3YzAzZTc4MWEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxYjBiMTgxZjBjNTQxZjdiMDUwZWIyNjE3ZDliYzNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU1ODQ0MzgxNywgLTczLjg4MjU3ODY5MTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDlmMTFhNjIxODdmNGNiNmEyNDg1YzgzMDYxMzkyYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNTIxYzlhNWNmMTY0MWFlODkyNDZlN2VlMDVlNWExNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTUyMWM5YTVjZjE2NDFhZTg5MjQ2ZTdlZTA1ZTVhMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM0ICg0NjMgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5ZjExYTYyMTg3ZjRjYjZhMjQ4NWM4MzA2MTM5MmM5LnNldENvbnRlbnQoaHRtbF9hNTIxYzlhNWNmMTY0MWFlODkyNDZlN2VlMDVlNWExNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMWIwYjE4MWYwYzU0MWY3YjA1MGViMjYxN2Q5YmMzZi5iaW5kUG9wdXAocG9wdXBfNDlmMTFhNjIxODdmNGNiNmEyNDg1YzgzMDYxMzkyYzkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzMThhNjlhOWJjMzQ0MmZhNjc0NWIzMjBlYjE1NzQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU1OTQyMjM5MiwgLTczLjg4MTY0NzI3MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjM2N2Y4NThkZTNiNGMyMmE0NDA2ZGY4NGM2MDliMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzQyNmFlMmRlOGU0YzFhOTU4NWE5YTBmNzhhNTgwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2M0MjZhZTJkZThlNGMxYTk1ODVhOWEwZjc4YTU4MDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM1ICg0MTcgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzNjdmODU4ZGUzYjRjMjJhNDQwNmRmODRjNjA5YjBmLnNldENvbnRlbnQoaHRtbF8zYzQyNmFlMmRlOGU0YzFhOTU4NWE5YTBmNzhhNTgwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMzE4YTY5YTliYzM0NDJmYTY3NDViMzIwZWIxNTc0OC5iaW5kUG9wdXAocG9wdXBfMjM2N2Y4NThkZTNiNGMyMmE0NDA2ZGY4NGM2MDliMGYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyMjg1YmEzNGRkOTQ3ZGRiMWQ2M2I0ZTYxNGQzNjZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2MDQwMDkyOSwgLTczLjg4MDcxOTQ1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzNjNTNmNmQ1Y2ZjNGVlY2E5NDVjNmYxMDc2MWMxNjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ODA5MmZjNDUxNjg0ZWI3OWZlZjgyMjUzM2M5ZmI4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTgwOTJmYzQ1MTY4NGViNzlmZWY4MjI1MzNjOWZiODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM2ICgzMjkgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczYzUzZjZkNWNmYzRlZWNhOTQ1YzZmMTA3NjFjMTY4LnNldENvbnRlbnQoaHRtbF85ODA5MmZjNDUxNjg0ZWI3OWZlZjgyMjUzM2M5ZmI4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMjI4NWJhMzRkZDk0N2RkYjFkNjNiNGU2MTRkMzY2ZC5iaW5kUG9wdXAocG9wdXBfNzNjNTNmNmQ1Y2ZjNGVlY2E5NDVjNmYxMDc2MWMxNjgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmYjNlOTE5NmY5YjRlYTBhZDFmNTk0YTg2YmJlMjA3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2MTM3OTM1NCwgLTczLjg3OTc4ODAzNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYThiYWFmNzlmMmViNGU4ZWJlYmQ3ZTEzOTJlODA1ZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTE2MTQ4ZGIzMWU0NzIwYmU4NjIwNDJlNjNmMDY5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2UxNjE0OGRiMzFlNDcyMGJlODYyMDQyZTYzZjA2OWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM3ICgyNTQgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4YmFhZjc5ZjJlYjRlOGViZWJkN2UxMzkyZTgwNWQxLnNldENvbnRlbnQoaHRtbF8zZTE2MTQ4ZGIzMWU0NzIwYmU4NjIwNDJlNjNmMDY5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZmIzZTkxOTZmOWI0ZWEwYWQxZjU5NGE4NmJiZTIwNy5iaW5kUG9wdXAocG9wdXBfYThiYWFmNzlmMmViNGU4ZWJlYmQ3ZTEzOTJlODA1ZDEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzM2NhMzFiMTdjNDRlYWQ5ZDdkOTUxNzA1YTNhODg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NDMxNDIyNSwgLTczLjg3Njk5NzM1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2FiZGQ1MzVhZWJiNGNiOWFmZGZjZDUzMTE4ZjdiMzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Njg5ODVjOTk0OTE0ZTc1YjdhYzk3OTc1N2U1Njk0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDY4OTg1Yzk5NDkxNGU3NWI3YWM5Nzk3NTdlNTY5NDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM4ICgyNDAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhYmRkNTM1YWViYjRjYjlhZmRmY2Q1MzExOGY3YjM5LnNldENvbnRlbnQoaHRtbF80Njg5ODVjOTk0OTE0ZTc1YjdhYzk3OTc1N2U1Njk0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMzNjYTMxYjE3YzQ0ZWFkOWQ3ZDk1MTcwNWEzYTg4Ni5iaW5kUG9wdXAocG9wdXBfM2FiZGQ1MzVhZWJiNGNiOWFmZGZjZDUzMTE4ZjdiMzkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkYzU3NzU3YjNhYTQzZmY4Mjg0OGY3Nzk3ZmNjZjBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ3MjM2NDEzNiwgLTczLjg4NzY0NjQ3ODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjA4ODllMDMzNzczNGQwZDljMjNkZDA4MDIzZjlkN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZmExZWRmZDYwZDI0M2FlYTE1YmExZjFlMTU0NWI2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmZhMWVkZmQ2MGQyNDNhZWExNWJhMWYxZTE1NDViNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjM5ICgyNDcgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYwODg5ZTAzMzc3MzRkMGQ5YzIzZGQwODAyM2Y5ZDdlLnNldENvbnRlbnQoaHRtbF9iZmExZWRmZDYwZDI0M2FlYTE1YmExZjFlMTU0NWI2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZGM1Nzc1N2IzYWE0M2ZmODI4NDhmNzc5N2ZjY2YwYy5iaW5kUG9wdXAocG9wdXBfNjA4ODllMDMzNzczNGQwZDljMjNkZDA4MDIzZjlkN2UpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1ZjM2ZjZiMDcwOTQ5ZTFhNmU1MDgwZDRlZTZmNTAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwODAyMzUyNiwgLTczLjg5Mzk3NDYxODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTllYmQ0Y2YwOWY2NGM2Y2EyMTdjNzkxY2VhNWQ0NTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMDliNGJjMGM1YzA0ZDFhYjM5NmE3MzllYTIxNmQ4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzA5YjRiYzBjNWMwNGQxYWIzOTZhNzM5ZWEyMTZkODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQwICgyOTMgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5ZWJkNGNmMDlmNjRjNmNhMjE3Yzc5MWNlYTVkNDUyLnNldENvbnRlbnQoaHRtbF9jMDliNGJjMGM1YzA0ZDFhYjM5NmE3MzllYTIxNmQ4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NWYzNmY2YjA3MDk0OWUxYTZlNTA4MGQ0ZWU2ZjUwMS5iaW5kUG9wdXAocG9wdXBfNTllYmQ0Y2YwOWY2NGM2Y2EyMTdjNzkxY2VhNWQ0NTIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkMzc2ZWY3ZDEyNTQxMTE5MDY3NTk2OGFkNmM1NmIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwOTAwMzA2NiwgLTczLjg5MzA0Njg5NTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVjZTJhOTAxZDM2NDM2YWI1MjU4YzA2MWI4ZGNjMGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjdlOTkwYjJhODI0YTg4ODZjNDA3YzkzZmQ5NTEwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2I3ZTk5MGIyYTgyNGE4ODg2YzQwN2M5M2ZkOTUxMDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQxICgyNTMgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1Y2UyYTkwMWQzNjQzNmFiNTI1OGMwNjFiOGRjYzBhLnNldENvbnRlbnQoaHRtbF8zYjdlOTkwYjJhODI0YTg4ODZjNDA3YzkzZmQ5NTEwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDM3NmVmN2QxMjU0MTExOTA2NzU5NjhhZDZjNTZiMi5iaW5kUG9wdXAocG9wdXBfNzVjZTJhOTAxZDM2NDM2YWI1MjU4YzA2MWI4ZGNjMGEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiZThkNjU4NmViOTQ1NTBhYWRkNWVjNTUwM2JmZGZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwOTk1NTA3NSwgLTczLjg5MjExOTE3NDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTVhZGJhMjQ5NDliNDlmODkxMGM2NGM1ZWM0MzAxYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjcyZDEyNWY0N2M0ZjVhOWJlYWQ0MjI5MDVkYTVjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGI3MmQxMjVmNDdjNGY1YTliZWFkNDIyOTA1ZGE1Y2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQyICgyNTMgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1YWRiYTI0OTQ5YjQ5Zjg5MTBjNjRjNWVjNDMwMWEyLnNldENvbnRlbnQoaHRtbF9kYjcyZDEyNWY0N2M0ZjVhOWJlYWQ0MjI5MDVkYTVjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YmU4ZDY1ODZlYjk0NTUwYWFkZDVlYzU1MDNiZmRmZC5iaW5kUG9wdXAocG9wdXBfOTVhZGJhMjQ5NDliNDlmODkxMGM2NGM1ZWM0MzAxYTIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3NThlNjU0OGQ1MDQzN2U4YmUyNWIxNWY2M2VlN2FkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxMDkzNDQyMywgLTczLjg5MTE4NzgzNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmM0NGQyNTQzMmU2NDRmZmEwNWIwNWE0YWZkMjJiNjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNjcyMjQyZTFmMTQ0OTc1ODYxOTEzYmVhNzFlOTZhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjY3MjI0MmUxZjE0NDk3NTg2MTkxM2JlYTcxZTk2YTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQzICgyOTMgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjNDRkMjU0MzJlNjQ0ZmZhMDViMDVhNGFmZDIyYjY2LnNldENvbnRlbnQoaHRtbF9iNjcyMjQyZTFmMTQ0OTc1ODYxOTEzYmVhNzFlOTZhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNzU4ZTY1NDhkNTA0MzdlOGJlMjViMTVmNjNlZTdhZC5iaW5kUG9wdXAocG9wdXBfMmM0NGQyNTQzMmU2NDRmZmEwNWIwNWE0YWZkMjJiNjYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdmNzZjY2NiMDhiZTRjZGM5NWY4MTI4YmUxZWNiNDY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxNDg1MTEzOSwgLTczLjg4NzQ2OTY3OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGVjMjAyMjFjNGE5NDg5N2FlNzg5ZTQ4ZDAzNDY5ZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzE4MTg0YWRmMDg0YzVmYjdlZmRkY2FhMDYwOGEwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTMxODE4NGFkZjA4NGM1ZmI3ZWZkZGNhYTA2MDhhMDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ0ICgzNzMgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlYzIwMjIxYzRhOTQ4OTdhZTc4OWU0OGQwMzQ2OWRmLnNldENvbnRlbnQoaHRtbF8xMzE4MTg0YWRmMDg0YzVmYjdlZmRkY2FhMDYwOGEwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Zjc2Y2NjYjA4YmU0Y2RjOTVmODEyOGJlMWVjYjQ2OC5iaW5kUG9wdXAocG9wdXBfNGVjMjAyMjFjNGE5NDg5N2FlNzg5ZTQ4ZDAzNDY5ZGYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiOGExYzcwMTc1NTRiZjdhZjI0Y2ZkYTkyY2JlYTgyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxNTgzMDE0NiwgLTczLjg4NjU0MTkzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc4MDc2ZmQ1ZjM4NGFhMzgzNjY4NTBkZDI3YzBiNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYWM3NzI0YTVkOGI0ODU0YWI5NGRjNDBkOTEzMjlkYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWFjNzcyNGE1ZDhiNDg1NGFiOTRkYzQwZDkxMzI5ZGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ1ICgzMDkgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3ODA3NmZkNWYzODRhYTM4MzY2ODUwZGQyN2MwYjQ2LnNldENvbnRlbnQoaHRtbF8xYWM3NzI0YTVkOGI0ODU0YWI5NGRjNDBkOTEzMjlkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYjhhMWM3MDE3NTU0YmY3YWYyNGNmZGE5MmNiZWE4Mi5iaW5kUG9wdXAocG9wdXBfYjc4MDc2ZmQ1ZjM4NGFhMzgzNjY4NTBkZDI3YzBiNDYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2YWQ4MTAzMGJhYTQ0MmM4YjYzMTNmMjY0OWQwNTQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxODc2NjY1NSwgLTczLjg4Mzc1MTQ3NzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUyNTRhNzhmYjQyNDQ5Y2I4ZjY2OTVjOWY5MjlhMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZTUwZGYyZmU2ZTU0MTYzYWYzOTY4ZmIzODM5NWM2NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWU1MGRmMmZlNmU1NDE2M2FmMzk2OGZiMzgzOTVjNjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ2ICgxODggIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MjU0YTc4ZmI0MjQ0OWNiOGY2Njk1YzlmOTI5YTEwLnNldENvbnRlbnQoaHRtbF8xZTUwZGYyZmU2ZTU0MTYzYWYzOTY4ZmIzODM5NWM2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NmFkODEwMzBiYWE0NDJjOGI2MzEzZjI2NDlkMDU0My5iaW5kUG9wdXAocG9wdXBfYjUyNTRhNzhmYjQyNDQ5Y2I4ZjY2OTVjOWY5MjlhMTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1NjE2YWFjZWI4ZTQwOWNiNTYyNzdiMGExYzg0MzYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxOTc0NTM2MiwgLTczLjg4MjgyMzcyNDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjJlM2M4ZDg1NmI4NDUzZjhiMjIzZjAyZjFmNWVmYjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTZhMzZlOWFlZGU0NzdlYWQwMTdlOTNkMTRkOTAxZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTk2YTM2ZTlhZWRlNDc3ZWFkMDE3ZTkzZDE0ZDkwMWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ3ICgyNDAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YyZTNjOGQ4NTZiODQ1M2Y4YjIyM2YwMmYxZjVlZmIzLnNldENvbnRlbnQoaHRtbF8xOTZhMzZlOWFlZGU0NzdlYWQwMTdlOTNkMTRkOTAxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNTYxNmFhY2ViOGU0MDljYjU2Mjc3YjBhMWM4NDM2My5iaW5kUG9wdXAocG9wdXBfZjJlM2M4ZDg1NmI4NDUzZjhiMjIzZjAyZjFmNWVmYjMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBlNDUwYjYzYzE5NDQxNDI4MTk2MTQ2OWNmNmFmOWM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMTcwMjQ3OCwgLTczLjg4MDk2MDk5MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFlNzFkMzU0ZGRmNGMyZTk1MTk3N2ZhZjM3Yjk1YzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzhiODc3YTViMzE0MzMxYTc3ZTc4NmJiYTMyYTJhMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDc4Yjg3N2E1YjMxNDMzMWE3N2U3ODZiYmEzMmEyYTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ4ICgyNzYgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhZTcxZDM1NGRkZjRjMmU5NTE5NzdmYWYzN2I5NWM5LnNldENvbnRlbnQoaHRtbF80NzhiODc3YTViMzE0MzMxYTc3ZTc4NmJiYTMyYTJhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTQ1MGI2M2MxOTQ0MTQyODE5NjE0NjljZjZhZjljOC5iaW5kUG9wdXAocG9wdXBfNmFlNzFkMzU0ZGRmNGMyZTk1MTk3N2ZhZjM3Yjk1YzkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiY2ZmNDc3YjdkNDQ5ZTg5MTAzOGRmYTkzM2NhZWY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMjc2MzMwMywgLTczLjg4MDAzMzIxNTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzIyYTdiYjIzNzlhNDVjZjg4MTQyNDE5MDU4ZTIxOGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZmU3Y2JlMzI4NmI0YThmYWUyNjY0OTExOTFiZGE3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfNGZlN2NiZTMyODZiNGE4ZmFlMjY2NDkxMTkxYmRhN2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjQ5ICgyNzAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyMmE3YmIyMzc5YTQ1Y2Y4ODE0MjQxOTA1OGUyMThkLnNldENvbnRlbnQoaHRtbF80ZmU3Y2JlMzI4NmI0YThmYWUyNjY0OTExOTFiZGE3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYmNmZjQ3N2I3ZDQ0OWU4OTEwMzhkZmE5MzNjYWVmOC5iaW5kUG9wdXAocG9wdXBfNzIyYTdiYjIzNzlhNDVjZjg4MTQyNDE5MDU4ZTIxOGQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzY2JkODgzMGJkMDRiYmE5ZGFhYTY1OWJlOWEwZGZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyODUyMjY5MiwgLTczLjg3NDQ1MjE3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTY3MTEzMDI2ZTBkNGM1NDk3YmUwOTM1MjEzMzRhNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDk1Mjg2ZTNiZmM0YWY2OGIxNjRlOGMzNjExMzI0MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ5NTI4NmUzYmZjNGFmNjhiMTY0ZThjMzYxMTMyNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjUwICg4MiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY3MTEzMDI2ZTBkNGM1NDk3YmUwOTM1MjEzMzRhNWUuc2V0Q29udGVudChodG1sXzI0OTUyODZlM2JmYzRhZjY4YjE2NGU4YzM2MTEzMjQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIzY2JkODgzMGJkMDRiYmE5ZGFhYTY1OWJlOWEwZGZjLmJpbmRQb3B1cChwb3B1cF8xNjcxMTMwMjZlMGQ0YzU0OTdiZTA5MzUyMTMzNGE1ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTkxMzIzMmRjZTk2NDYxNWJhN2EzMDVjMzEzNDc3MDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTI5NTI4MTM3LCAtNzMuODczNTI3OTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84N2U3ODI0ZDc2MWY0ZDY3OGMwMjNlNjQ3ZjBkMTkwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExYjQyODVlZjQ3NDRiNjZiODM4MTU0MTdhNmRjODU4ID0gJCgnPGRpdiBpZD0iaHRtbF8xMWI0Mjg1ZWY0NzQ0YjY2YjgzODE1NDE3YTZkYzg1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTEgKDg3ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84N2U3ODI0ZDc2MWY0ZDY3OGMwMjNlNjQ3ZjBkMTkwYy5zZXRDb250ZW50KGh0bWxfMTFiNDI4NWVmNDc0NGI2NmI4MzgxNTQxN2E2ZGM4NTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTkxMzIzMmRjZTk2NDYxNWJhN2EzMDVjMzEzNDc3MDkuYmluZFBvcHVwKHBvcHVwXzg3ZTc4MjRkNzYxZjRkNjc4YzAyM2U2NDdmMGQxOTBjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODg3MGM3MzI1Y2I0YjFmYjQyYTQxOTUzZmIxNWVkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MzMxODY5MDMsIC03My44NzE3OTEyMTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk3ZWIxNTQwZWUyYjQ5MTRhYzNkZjFiNjA4OTdiODE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODU5MDAwYTk0OTczNDlmODkxNWU5ZDA5ZDU5MzI0MDIgPSAkKCc8ZGl2IGlkPSJodG1sXzg1OTAwMGE5NDk3MzQ5Zjg5MTVlOWQwOWQ1OTMyNDAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41MiAoMjU4ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85N2ViMTU0MGVlMmI0OTE0YWMzZGYxYjYwODk3YjgxOS5zZXRDb250ZW50KGh0bWxfODU5MDAwYTk0OTczNDlmODkxNWU5ZDA5ZDU5MzI0MDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTg4NzBjNzMyNWNiNGIxZmI0MmE0MTk1M2ZiMTVlZDcuYmluZFBvcHVwKHBvcHVwXzk3ZWIxNTQwZWUyYjQ5MTRhYzNkZjFiNjA4OTdiODE5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YzgzMDZkNDY2ZWE0ODU5YTljYTE4MjdlODBlYzc3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTE1NDQyNzksIC03My44ODk5MDI1NTA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY1ZDJjOTZmNTYwYzQxMWU4NjU2M2FjZmIxMjMwZWU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDUyZGJkZmMxZmQxNDBkZGJhZWM2NDdiMzA5NmI4ZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzA1MmRiZGZjMWZkMTQwZGRiYWVjNjQ3YjMwOTZiOGRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41MyAoMTY5ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NWQyYzk2ZjU2MGM0MTFlODY1NjNhY2ZiMTIzMGVlNi5zZXRDb250ZW50KGh0bWxfMDUyZGJkZmMxZmQxNDBkZGJhZWM2NDdiMzA5NmI4ZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGM4MzA2ZDQ2NmVhNDg1OWE5Y2ExODI3ZTgwZWM3N2MuYmluZFBvcHVwKHBvcHVwXzY1ZDJjOTZmNTYwYzQxMWU4NjU2M2FjZmIxMjMwZWU2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzRkOTFiZDU4Mjg0YWE0OWNhOGM0NjQ1NmVlMGFlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTI0OTYwMzQsIC03My44ODg5NzQ4NDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFlOGU2NTAxM2QyNDEzMjg5MTJkMjgxZGRkMTM3MDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNTM0MjU4OTI0MDU0YmQzODAyYzNkODkwOGE5NmViNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTUzNDI1ODkyNDA1NGJkMzgwMmMzZDg5MDhhOTZlYjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjU0ICg4NyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmFlOGU2NTAxM2QyNDEzMjg5MTJkMjgxZGRkMTM3MDEuc2V0Q29udGVudChodG1sX2E1MzQyNTg5MjQwNTRiZDM4MDJjM2Q4OTA4YTk2ZWI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3NGQ5MWJkNTgyODRhYTQ5Y2E4YzQ2NDU2ZWUwYWU4LmJpbmRQb3B1cChwb3B1cF9mYWU4ZTY1MDEzZDI0MTMyODkxMmQyODFkZGQxMzcwMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzg2MGZiYzFlMDZhNDI1YWI5MTk1MGZjYjZlNDBlYWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY3ODYwNDA3LCAtNzMuODk0MTIzOTEzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NmNlOTdhMGI1OTk0MGJhOGM4ODdlYWQ2MTU5Y2NmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0NDY2M2VlNzExOTQxNTQ5OWRhNmVjM2JmMTZlNmM5ID0gJCgnPGRpdiBpZD0iaHRtbF8wNDQ2NjNlZTcxMTk0MTU0OTlkYTZlYzNiZjE2ZTZjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTUgKDYyOCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODZjZTk3YTBiNTk5NDBiYThjODg3ZWFkNjE1OWNjZmYuc2V0Q29udGVudChodG1sXzA0NDY2M2VlNzExOTQxNTQ5OWRhNmVjM2JmMTZlNmM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM4NjBmYmMxZTA2YTQyNWFiOTE5NTBmY2I2ZTQwZWFjLmJpbmRQb3B1cChwb3B1cF84NmNlOTdhMGI1OTk0MGJhOGM4ODdlYWQ2MTU5Y2NmZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjExNzEzNTYxNzAxNGE2MmI5ZWViNWVkNWExN2ZlOGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY4ODk0NzQ0LCAtNzMuODkzMTg1MjcwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YTI1NDM2NjBhY2M0MzFjYTNkMDY5NGUzZTEwOTdiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjZjM5NTI0NDVhNTQ2YmE5NDE2ZTNjY2E0NTljZTQxID0gJCgnPGRpdiBpZD0iaHRtbF9mY2YzOTUyNDQ1YTU0NmJhOTQxNmUzY2NhNDU5Y2U0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTYgKDYyOSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2EyNTQzNjYwYWNjNDMxY2EzZDA2OTRlM2UxMDk3YjQuc2V0Q29udGVudChodG1sX2ZjZjM5NTI0NDVhNTQ2YmE5NDE2ZTNjY2E0NTljZTQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxMTcxMzU2MTcwMTRhNjJiOWVlYjVlZDVhMTdmZThhLmJpbmRQb3B1cChwb3B1cF83YTI1NDM2NjBhY2M0MzFjYTNkMDY5NGUzZTEwOTdiNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjM5M2E1OGY1Mzk3NGQzOGI2NmNkOWMyZjFhNGI4NDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY5ODE5MzQ5LCAtNzMuODkyMjYxMDc5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZWI2OGE4MGYwZWY0YTgwOTA2MThlYjAyN2U5Y2YzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwODFlMGRmODhhYTRiY2I5ZGNhNWI3NWM2ZmE4NDIyID0gJCgnPGRpdiBpZD0iaHRtbF83MDgxZTBkZjg4YWE0YmNiOWRjYTViNzVjNmZhODQyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NTcgKDY0NSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmViNjhhODBmMGVmNGE4MDkwNjE4ZWIwMjdlOWNmM2Iuc2V0Q29udGVudChodG1sXzcwODFlMGRmODhhYTRiY2I5ZGNhNWI3NWM2ZmE4NDIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIzOTNhNThmNTM5NzRkMzhiNjZjZDljMmYxYTRiODQ2LmJpbmRQb3B1cChwb3B1cF9iZWI2OGE4MGYwZWY0YTgwOTA2MThlYjAyN2U5Y2YzYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGI4OTYzOGQyMGRlNGU1ZjkxZTg3MmM5OTkwOTQ0MjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTcwODgxMDUsIC03My44OTEzMjk2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3ZmQzNzZkODAyMjRlNzJhOGU2NzgzOWY0MDIwYTdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODExOWIzOWFiNjk3NGRiMmFjZWUyOWQ4YTY4NzE0MTkgPSAkKCc8ZGl2IGlkPSJodG1sXzgxMTliMzlhYjY5NzRkYjJhY2VlMjlkOGE2ODcxNDE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41OCAoNTgwICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iN2ZkMzc2ZDgwMjI0ZTcyYThlNjc4MzlmNDAyMGE3YS5zZXRDb250ZW50KGh0bWxfODExOWIzOWFiNjk3NGRiMmFjZWUyOWQ4YTY4NzE0MTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI4OTYzOGQyMGRlNGU1ZjkxZTg3MmM5OTkwOTQ0MjkuYmluZFBvcHVwKHBvcHVwX2I3ZmQzNzZkODAyMjRlNzJhOGU2NzgzOWY0MDIwYTdhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNjk4ZTVjYTA0ZTM0NTIxYjY3ZTliYjJkNGI5YmRlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NzE4MzI5MTksIC03My44OTA0MDE4MzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiZmI5ZTI1YmQ1MzQ4Mzg5ZGNkN2ZlZjcxMjU2MzYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzM2YjA1YWE4YjNiNDI5YmEyYmJkZGYzMjA2ZmYyM2UgPSAkKCc8ZGl2IGlkPSJodG1sXzMzNmIwNWFhOGIzYjQyOWJhMmJiZGRmMzIwNmZmMjNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij41OSAoNTIxICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYmZiOWUyNWJkNTM0ODM4OWRjZDdmZWY3MTI1NjM2My5zZXRDb250ZW50KGh0bWxfMzM2YjA1YWE4YjNiNDI5YmEyYmJkZGYzMjA2ZmYyM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjY5OGU1Y2EwNGUzNDUyMWI2N2U5YmIyZDRiOWJkZWIuYmluZFBvcHVwKHBvcHVwXzFiZmI5ZTI1YmQ1MzQ4Mzg5ZGNkN2ZlZjcxMjU2MzYzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTE1ODkzZGIxZTY0MmJjYWVlNTUyMmE2YmQyZDQwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NzI4Mzk1ODMsIC03My44ODk0NzA0MDM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3MGFkM2Q0NThmMTRjNzFhNjhiMWFiYThmZjEyN2VjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmExMjMzOWZjMTc2NGE1MDlmZWIyMTIwM2U3YzZlMjEgPSAkKCc8ZGl2IGlkPSJodG1sXzZhMTIzMzlmYzE3NjRhNTA5ZmViMjEyMDNlN2M2ZTIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42MCAoNDc3ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzBhZDNkNDU4ZjE0YzcxYTY4YjFhYmE4ZmYxMjdlYy5zZXRDb250ZW50KGh0bWxfNmExMjMzOWZjMTc2NGE1MDlmZWIyMTIwM2U3YzZlMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWExNTg5M2RiMWU2NDJiY2FlZTU1MjJhNmJkMmQ0MDEuYmluZFBvcHVwKHBvcHVwXzA3MGFkM2Q0NThmMTRjNzFhNjhiMWFiYThmZjEyN2VjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YzJiMmM5MWY4NjQ0NmE5OWU2ZTI2NGEzYzU5Yzg0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NzM3OTEzMDMsIC03My44ODg1NDI1OTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhYjEwYzg0ZTJkNDQ3Y2Y4N2YwMjk1NDhmOTA2YzJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmM1M2UyNzJmOTk3NDZlZjlkOWFiNWE2MzQwYjhmM2MgPSAkKCc8ZGl2IGlkPSJodG1sXzZjNTNlMjcyZjk5NzQ2ZWY5ZDlhYjVhNjM0MGI4ZjNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42MSAoNDU0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YWIxMGM4NGUyZDQ0N2NmODdmMDI5NTQ4ZjkwNmMyYy5zZXRDb250ZW50KGh0bWxfNmM1M2UyNzJmOTk3NDZlZjlkOWFiNWE2MzQwYjhmM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2MyYjJjOTFmODY0NDZhOTllNmUyNjRhM2M1OWM4NGIuYmluZFBvcHVwKHBvcHVwXzlhYjEwYzg0ZTJkNDQ3Y2Y4N2YwMjk1NDhmOTA2YzJjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMzNiNTlhMmI5ZTk0NzA4ODA0OTExOTM2YTBkOTExOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NzQ3NzAzNjEsIC03My44ODc2MTExNTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4NDljNGExNDc5ZjQyOGY5OTMxYzk3NDc0YzM0NTQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzJkM2VhMDg3NjQ5NDBhMjlkOGU5MGFkZjcwZjY2YWMgPSAkKCc8ZGl2IGlkPSJodG1sXzcyZDNlYTA4NzY0OTQwYTI5ZDhlOTBhZGY3MGY2NmFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42MiAoNDU0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODQ5YzRhMTQ3OWY0MjhmOTkzMWM5NzQ3NGMzNDU0NC5zZXRDb250ZW50KGh0bWxfNzJkM2VhMDg3NjQ5NDBhMjlkOGU5MGFkZjcwZjY2YWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzMzYjU5YTJiOWU5NDcwODgwNDkxMTkzNmEwZDkxMTkuYmluZFBvcHVwKHBvcHVwX2I4NDljNGExNDc5ZjQyOGY5OTMxYzk3NDc0YzM0NTQ0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZTE0MmVlYjAzZjg0ODUwYmQ0Y2NlOWI0ZTJmOGRjNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NzU3NzY4MjYsIC03My44ODY2ODMzMjg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjYWZjMmJkOTQyZDQyMWQ5YWQ1NGU5NDUxMTQwMzZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2QxY2EzNDUzOTRkNDZkZGI3MzUwYWYyZjE5MjI3OWYgPSAkKCc8ZGl2IGlkPSJodG1sXzNkMWNhMzQ1Mzk0ZDQ2ZGRiNzM1MGFmMmYxOTIyNzlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42MyAoNDc4ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2FmYzJiZDk0MmQ0MjFkOWFkNTRlOTQ1MTE0MDM2Yi5zZXRDb250ZW50KGh0bWxfM2QxY2EzNDUzOTRkNDZkZGI3MzUwYWYyZjE5MjI3OWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGUxNDJlZWIwM2Y4NDg1MGJkNGNjZTliNGUyZjhkYzQuYmluZFBvcHVwKHBvcHVwXzFjYWZjMmJkOTQyZDQyMWQ5YWQ1NGU5NDUxMTQwMzZiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDg0ZDk3N2QxYTE0N2FmYTBiNTA5MGFmZTk4NTA4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NzY3NTU3MzMsIC03My44ODU3NTE4OTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkNTdkZTE3ZDVlODQ4MTZiNWNiMGI5M2RmMGFkMjdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTEwYjZhMDA4OTA2NDhjYjlmNWRlMGRkMWMyZmYyMTMgPSAkKCc8ZGl2IGlkPSJodG1sXzExMGI2YTAwODkwNjQ4Y2I5ZjVkZTBkZDFjMmZmMjEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42NCAoNTIyICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZDU3ZGUxN2Q1ZTg0ODE2YjVjYjBiOTNkZjBhZDI3Yi5zZXRDb250ZW50KGh0bWxfMTEwYjZhMDA4OTA2NDhjYjlmNWRlMGRkMWMyZmYyMTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjQ4NGQ5NzdkMWExNDdhZmEwYjUwOTBhZmU5ODUwOGQuYmluZFBvcHVwKHBvcHVwXzhkNTdkZTE3ZDVlODQ4MTZiNWNiMGI5M2RmMGFkMjdiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTJjZjBkOGE2Y2U0ZGUwYjVkYWIzYWZiNGMyMzUyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1Nzc3MDcxNTMsIC03My44ODQ4MjQwNjM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRjOGVmMjgwOTk5MjQ2MDBiZThlMzZhZmRiZTFjNGQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTRhMjE2OGIyZThlNGQ0Yzk4MmZjNTc5MmVhZmFkZTAgPSAkKCc8ZGl2IGlkPSJodG1sXzE0YTIxNjhiMmU4ZTRkNGM5ODJmYzU3OTJlYWZhZGUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42NSAoNTgxICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YzhlZjI4MDk5OTI0NjAwYmU4ZTM2YWZkYmUxYzRkMi5zZXRDb250ZW50KGh0bWxfMTRhMjE2OGIyZThlNGQ0Yzk4MmZjNTc5MmVhZmFkZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDEyY2YwZDhhNmNlNGRlMGI1ZGFiM2FmYjRjMjM1MjMuYmluZFBvcHVwKHBvcHVwXzRjOGVmMjgwOTk5MjQ2MDBiZThlMzZhZmRiZTFjNGQyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MTZjNDM1NDU4ZTI0MzEwYWYzMDRlNWI2MTZkMDk4MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1Nzg2ODU5NDYsIC03My44ODM4OTYyMzExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjNzRiNjdlNDNkYzRkZDdhNzYzMTliNzUyNjc3ZmUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ4MDQzYTM2MWE2NGJlZWI4YWY3MDg1OThiZDQzZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzM0ODA0M2EzNjFhNjRiZWViOGFmNzA4NTk4YmQ0M2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42NiAoNTg2ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Yzc0YjY3ZTQzZGM0ZGQ3YTc2MzE5Yjc1MjY3N2ZlMi5zZXRDb250ZW50KGh0bWxfMzQ4MDQzYTM2MWE2NGJlZWI4YWY3MDg1OThiZDQzZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTE2YzQzNTQ1OGUyNDMxMGFmMzA0ZTViNjE2ZDA5ODEuYmluZFBvcHVwKHBvcHVwXzZjNzRiNjdlNDNkYzRkZDdhNzYzMTliNzUyNjc3ZmUyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTU3ZDdkZjlmMzk0ZGMxOTNjNzcyYzExNWFjNTUxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1Nzk2OTIwMzgsIC03My44ODI5NjExNzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyNjg0NDgyNzU1YzQ3NzliYzJjM2YyYjEzYjUwNWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTczMWY3MjQyZjExNGZjNzkxMTMzMTJhNmQxZDIxMWYgPSAkKCc8ZGl2IGlkPSJodG1sXzU3MzFmNzI0MmYxMTRmYzc5MTEzMzEyYTZkMWQyMTFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42NyAoNDg0ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjY4NDQ4Mjc1NWM0Nzc5YmMyYzNmMmIxM2I1MDVmYS5zZXRDb250ZW50KGh0bWxfNTczMWY3MjQyZjExNGZjNzkxMTMzMTJhNmQxZDIxMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmU1N2Q3ZGY5ZjM5NGRjMTkzYzc3MmMxMTVhYzU1MTcuYmluZFBvcHVwKHBvcHVwX2YyNjg0NDgyNzU1YzQ3NzliYzJjM2YyYjEzYjUwNWZhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDVkYjAxZDU1MDI0NjA4ODczYWZmMGRhYjk0NzFlZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODE2MjE3NzQsIC03My44ODExMDE4ODY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwOTI2NjdjZWU5MTRhNDU4MjZmY2Y3ZTBlZmQxMzk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODNlNGM4YThjNWI4NDRhZGEwOGRmZWViOWE5NjY5M2YgPSAkKCc8ZGl2IGlkPSJodG1sXzgzZTRjOGE4YzViODQ0YWRhMDhkZmVlYjlhOTY2OTNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42OCAoMjg1ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMDkyNjY3Y2VlOTE0YTQ1ODI2ZmNmN2UwZWZkMTM5OC5zZXRDb250ZW50KGh0bWxfODNlNGM4YThjNWI4NDRhZGEwOGRmZWViOWE5NjY5M2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTA1ZGIwMWQ1NTAyNDYwODg3M2FmZjBkYWI5NDcxZWQuYmluZFBvcHVwKHBvcHVwXzEwOTI2NjdjZWU5MTRhNDU4MjZmY2Y3ZTBlZmQxMzk4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDExNTU5NDU0MWI0MzQxYmE4ZjVhMzdiMTIzMzQ5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODI2MDAyNjcsIC03My44ODAxNzQwNDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ZGU1OTFhYzdkOTQ1NjNiMWI1NzcxZWVlNzk4NDM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2JhODMzYzlmMGM0NDdmZmIzMWU4ZWI3MDc1OTE1MzUgPSAkKCc8ZGl2IGlkPSJodG1sX2NiYTgzM2M5ZjBjNDQ3ZmZiMzFlOGViNzA3NTkxNTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij42OSAoMTk1ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOGRlNTkxYWM3ZDk0NTYzYjFiNTc3MWVlZTc5ODQzNy5zZXRDb250ZW50KGh0bWxfY2JhODMzYzlmMGM0NDdmZmIzMWU4ZWI3MDc1OTE1MzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjAxMTU1OTQ1NDFiNDM0MWJhOGY1YTM3YjEyMzM0OTQuYmluZFBvcHVwKHBvcHVwX2U4ZGU1OTFhYzdkOTQ1NjNiMWI1NzcxZWVlNzk4NDM3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYzczNjdiOWUzZmI0NDQzYTBjMWIwOGNiMmM2OGQzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODM2MDYwOTUsIC03My44NzkyNDI1ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2MWRkZjNhZDkxYzQ0MGFiZTQ5MDYwZjBiNDYwMjE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzFhMjhlZTQ5N2MwNDZkMWEwNWQ3YzBmZTBiMzdiOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzMxYTI4ZWU0OTdjMDQ2ZDFhMDVkN2MwZmUwYjM3YjhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43MCAoMTI3ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjFkZGYzYWQ5MWM0NDBhYmU0OTA2MGYwYjQ2MDIxOS5zZXRDb250ZW50KGh0bWxfMzFhMjhlZTQ5N2MwNDZkMWEwNWQ3YzBmZTBiMzdiOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2M3MzY3YjllM2ZiNDQ0M2EwYzFiMDhjYjJjNjhkMzAuYmluZFBvcHVwKHBvcHVwXzk2MWRkZjNhZDkxYzQ0MGFiZTQ5MDYwZjBiNDYwMjE5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NzdmZWUxNDA4YWI0MmZhYjdhNGJkNjRmMjc3NjVkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODQ1NTY5OTEsIC03My44NzgzMTQ3MzUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwZThiZGNkMzAyYjQzYjViMTIyMTkwNzRlMjZmZTFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjYxZTFjNjQwMWUyNGUzM2JiYWFmMzNkZmI0MGNkZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzI2MWUxYzY0MDFlMjRlMzNiYmFhZjMzZGZiNDBjZGY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij43MSAoMTI3ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGU4YmRjZDMwMmI0M2I1YjEyMjE5MDc0ZTI2ZmUxYi5zZXRDb250ZW50KGh0bWxfMjYxZTFjNjQwMWUyNGUzM2JiYWFmMzNkZmI0MGNkZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjc3ZmVlMTQwOGFiNDJmYWI3YTRiZDY0ZjI3NzY1ZDguYmluZFBvcHVwKHBvcHVwXzAwZThiZGNkMzAyYjQzYjViMTIyMTkwNzRlMjZmZTFiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82M2JkZjZhMTM4YTE0NDkwOTY1NGRkMzE2YzVhNzczNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1ODU1MzUyMywgLTczLjg3NzM4MzI3MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZlOGMxZjc4Yzk2NGVmYmFjMGQ4NDk2MzQzZTUzODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNWVlM2QyNmY4NTk0OTQxYTc2YjQ2MjU4ZDg1MDIyZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjVlZTNkMjZmODU5NDk0MWE3NmI0NjI1OGQ4NTAyMmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjcyICgxOTUgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmZThjMWY3OGM5NjRlZmJhYzBkODQ5NjM0M2U1Mzg3LnNldENvbnRlbnQoaHRtbF8yNWVlM2QyNmY4NTk0OTQxYTc2YjQ2MjU4ZDg1MDIyZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82M2JkZjZhMTM4YTE0NDkwOTY1NGRkMzE2YzVhNzczNS5iaW5kUG9wdXAocG9wdXBfYmZlOGMxZjc4Yzk2NGVmYmFjMGQ4NDk2MzQzZTUzODcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0ZmVhYmI3MzUzYjQ2YmZiY2ZiMDg5OWYyNjM2ZjRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU4NTg2MTEwNSwgLTczLjg3NDUwOTk1MTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzdkM2U0OGY4YzBlNDE1MGIwNjA2NTJlYzA4ZDI2YmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNzE0MzBhMTU2M2Y0NzZhOGY3MDA3MGQ0Njk1MjFiNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjcxNDMwYTE1NjNmNDc2YThmNzAwNzBkNDY5NTIxYjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjczICgxNTAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3ZDNlNDhmOGMwZTQxNTBiMDYwNjUyZWMwOGQyNmJiLnNldENvbnRlbnQoaHRtbF9iNzE0MzBhMTU2M2Y0NzZhOGY3MDA3MGQ0Njk1MjFiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNGZlYWJiNzM1M2I0NmJmYmNmYjA4OTlmMjYzNmY0Zi5iaW5kUG9wdXAocG9wdXBfMzdkM2U0OGY4YzBlNDE1MGIwNjA2NTJlYzA4ZDI2YmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkYWM2MjcyZTMyOTQ2YTNhODljOTllNTEyZGU4NDQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ5MzQ3NDk1MiwgLTczLjg4ODAyNTQ4NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZiZmM5MjllZWQ5NGFkZTgxMDA1ZDk5MmMxYmVmYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDc2NmQ1ZmFmZTc0ZTM5OGUwNjEyNWQ2OTlmZDM1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTA3NjZkNWZhZmU3NGUzOThlMDYxMjVkNjk5ZmQzNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjc0ICg5MyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZiZmM5MjllZWQ5NGFkZTgxMDA1ZDk5MmMxYmVmYWMuc2V0Q29udGVudChodG1sXzEwNzY2ZDVmYWZlNzRlMzk4ZTA2MTI1ZDY5OWZkMzU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkYWM2MjcyZTMyOTQ2YTNhODljOTllNTEyZGU4NDQ0LmJpbmRQb3B1cChwb3B1cF8zNmJmYzkyOWVlZDk0YWRlODEwMDVkOTkyYzFiZWZhYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJkYTVmYjlmNzkzNDU3NTk3YmI4OTNmM2UwNmE1M2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY3OTU1OTk4LCAtNzMuODczNjU0MjU2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMTM2ZDY0ODZkMGU0YTFmYjZkOWVlYmQwMWZjNDA0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwNzMxMGIxYzYyZDQ4ZmQ5MjgxNDc2NDkxODgzZGUyID0gJCgnPGRpdiBpZD0iaHRtbF9hMDczMTBiMWM2MmQ0OGZkOTI4MTQ3NjQ5MTg4M2RlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzUgKDE0NSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDEzNmQ2NDg2ZDBlNGExZmI2ZDllZWJkMDFmYzQwNGIuc2V0Q29udGVudChodG1sX2EwNzMxMGIxYzYyZDQ4ZmQ5MjgxNDc2NDkxODgzZGUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyZGE1ZmI5Zjc5MzQ1NzU5N2JiODkzZjNlMDZhNTNmLmJpbmRQb3B1cChwb3B1cF8wMTM2ZDY0ODZkMGU0YTFmYjZkOWVlYmQwMWZjNDA0YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmJiZDZhNDgzZDk1NDRkMTk2MzQxMzI0NmYzNWM5MzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzNjE3Nzk1LCAtNzMuODc2OTIyMDI2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOWI5NzZhOTYxZWI0ZWIxODM3YjcwMDE5Yjk5MGQwNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RjNWZjODRhNmZhZDQ4NmFiNzI3ZjEwYTAwYjhhMWNiID0gJCgnPGRpdiBpZD0iaHRtbF9kYzVmYzg0YTZmYWQ0ODZhYjcyN2YxMGEwMGI4YTFjYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzYgKDQ1OCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDliOTc2YTk2MWViNGViMTgzN2I3MDAxOWI5OTBkMDUuc2V0Q29udGVudChodG1sX2RjNWZjODRhNmZhZDQ4NmFiNzI3ZjEwYTAwYjhhMWNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiYmQ2YTQ4M2Q5NTQ0ZDE5NjM0MTMyNDZmMzVjOTM2LmJpbmRQb3B1cChwb3B1cF8wOWI5NzZhOTYxZWI0ZWIxODM3YjcwMDE5Yjk5MGQwNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzY1MDEwM2E1ZTI1NGZmZTlmYzAyZWI2MTU4YTkyNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkwMjgwOTI4LCAtNzMuODg3ODkzNzAyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZTZhNDNiYzJlMjQ0MmFlYTI2MzUzOWJjYzU2NmMyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1MmEwNzk2OTdjOTRmODdhYjQ1OGNhODU5MGM0MDE0ID0gJCgnPGRpdiBpZD0iaHRtbF9iNTJhMDc5Njk3Yzk0Zjg3YWI0NThjYTg1OTBjNDAxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzcgKDY4MyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmU2YTQzYmMyZTI0NDJhZWEyNjM1MzliY2M1NjZjMjkuc2V0Q29udGVudChodG1sX2I1MmEwNzk2OTdjOTRmODdhYjQ1OGNhODU5MGM0MDE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2NTAxMDNhNWUyNTRmZmU5ZmMwMmViNjE1OGE5MjU3LmJpbmRQb3B1cChwb3B1cF9mZTZhNDNiYzJlMjQ0MmFlYTI2MzUzOWJjYzU2NmMyOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDY3NDgxNDg2N2I2NDE5MzhiYTk5NDJkODg5YTdhNmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTk5MDg5NDI3LCAtNzMuODc5NTI0OTM5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YjRjNzA4MDJhYTE0MWM0OTNiNDliYjIwNzZmYWE4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MzliMmVjZDE1ZDQ3M2U4ODQ1MzJlNjU0NTAxYzRjID0gJCgnPGRpdiBpZD0iaHRtbF8zNDM5YjJlY2QxNWQ0NzNlODg0NTMyZTY1NDUwMWM0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzggKDM0OSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2I0YzcwODAyYWExNDFjNDkzYjQ5YmIyMDc2ZmFhODcuc2V0Q29udGVudChodG1sXzM0MzliMmVjZDE1ZDQ3M2U4ODQ1MzJlNjU0NTAxYzRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2NzQ4MTQ4NjdiNjQxOTM4YmE5OTQyZDg4OWE3YTZmLmJpbmRQb3B1cChwb3B1cF83YjRjNzA4MDJhYTE0MWM0OTNiNDliYjIwNzZmYWE4NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQ5YTI1ZTczYmJjNGI4M2JjZDQ5YmQzZGRmMzZjNTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkyMjM4ODk4LCAtNzMuODg2MDM0Mzk4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYWY3YzBjNTc1NmU0ZWRiOGY2MmEwYzE4MzdlNWNiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0MDZiMTg1ZDFhOTRjY2FiYjE1NDAxZThjODAzZDMwID0gJCgnPGRpdiBpZD0iaHRtbF9hNDA2YjE4NWQxYTk0Y2NhYmIxNTQwMWU4YzgwM2QzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+NzkgKDczMCAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2FmN2MwYzU3NTZlNGVkYjhmNjJhMGMxODM3ZTVjYjguc2V0Q29udGVudChodG1sX2E0MDZiMTg1ZDFhOTRjY2FiYjE1NDAxZThjODAzZDMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VkOWEyNWU3M2JiYzRiODNiY2Q0OWJkM2RkZjM2YzUzLmJpbmRQb3B1cChwb3B1cF8zYWY3YzBjNTc1NmU0ZWRiOGY2MmEwYzE4MzdlNWNiOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDEyNTM2MzU0ZmNiNGNjMGI3YmJlMGIyY2RlY2UyNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTM3MjI0MjU3LCAtNzMuODg1MDM2Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkYzJmNjc1YzBlNzRiNDU5MDQ3MTY3NzJjOTM3ZmFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGEwZjc2ZWE2MmUyNDk5ZDg2MDExMWUxMjc5ZjQxYzcgPSAkKCc8ZGl2IGlkPSJodG1sX2RhMGY3NmVhNjJlMjQ5OWQ4NjAxMTFlMTI3OWY0MWM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44MCAoMTIwICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZGMyZjY3NWMwZTc0YjQ1OTA0NzE2NzcyYzkzN2ZhZS5zZXRDb250ZW50KGh0bWxfZGEwZjc2ZWE2MmUyNDk5ZDg2MDExMWUxMjc5ZjQxYzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDEyNTM2MzU0ZmNiNGNjMGI3YmJlMGIyY2RlY2UyNzYuYmluZFBvcHVwKHBvcHVwXzRkYzJmNjc1YzBlNzRiNDU5MDQ3MTY3NzJjOTM3ZmFlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzgwMTU4YjQ4ZDg0MzExYTQyZTg4MDkxMzE4NzgwMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MTc3ODc4OTksIC03My44ODQ2ODI4MzUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0ZjllOTA1YjhjNDQ3NzFhNmQ5ODY5ZGE5ZjkxN2QyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNkMDVhY2U4NzI2NGE5Yzg5OTQ0NjhmYWRjZGI4YjUgPSAkKCc8ZGl2IGlkPSJodG1sXzhjZDA1YWNlODcyNjRhOWM4OTk0NDY4ZmFkY2RiOGI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44MSAoMTg2ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NGY5ZTkwNWI4YzQ0NzcxYTZkOTg2OWRhOWY5MTdkMi5zZXRDb250ZW50KGh0bWxfOGNkMDVhY2U4NzI2NGE5Yzg5OTQ0NjhmYWRjZGI4YjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc4MDE1OGI0OGQ4NDMxMWE0MmU4ODA5MTMxODc4MDIuYmluZFBvcHVwKHBvcHVwXzg0ZjllOTA1YjhjNDQ3NzFhNmQ5ODY5ZGE5ZjkxN2QyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTE4ZmQ2NWEzM2E0ZDc4ODMxYmM2OTAwMGZmMDIyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTczNjMyMDEsIC03My44ODQzMDc0MTIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0OTVlMmE0MDNjOTRmODI4NTQwOWVlY2Q1ZTBiZGIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzJhYzZkZGEzMTExNGMxZmJhYTA4ODBkOGI4NTk1MjQgPSAkKCc8ZGl2IGlkPSJodG1sXzMyYWM2ZGRhMzExMTRjMWZiYWEwODgwZDhiODU5NTI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44MiAoNjQgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0OTVlMmE0MDNjOTRmODI4NTQwOWVlY2Q1ZTBiZGIxLnNldENvbnRlbnQoaHRtbF8zMmFjNmRkYTMxMTE0YzFmYmFhMDg4MGQ4Yjg1OTUyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NTE4ZmQ2NWEzM2E0ZDc4ODMxYmM2OTAwMGZmMDIyZC5iaW5kUG9wdXAocG9wdXBfMjQ5NWUyYTQwM2M5NGY4Mjg1NDA5ZWVjZDVlMGJkYjEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljODQzMmYyYmVlYjRkOTk5Y2RlMjgzYzI2MTM5NzE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUxNjgwOTA0MiwgLTczLjg4NTYxMDU4MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmJmYWU4YjNhMjFjNDRhM2E4MTE3ZjljMDRjZTE1ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMjhkOGNhMzkzZDc0OTQ1YTUwY2E3NTQ1ZjZkNjFhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjI4ZDhjYTM5M2Q3NDk0NWE1MGNhNzU0NWY2ZDYxYWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjgzICgyMzcgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZiZmFlOGIzYTIxYzQ0YTNhODExN2Y5YzA0Y2UxNWZiLnNldENvbnRlbnQoaHRtbF9iMjhkOGNhMzkzZDc0OTQ1YTUwY2E3NTQ1ZjZkNjFhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Yzg0MzJmMmJlZWI0ZDk5OWNkZTI4M2MyNjEzOTcxNy5iaW5kUG9wdXAocG9wdXBfZmJmYWU4YjNhMjFjNDRhM2E4MTE3ZjljMDRjZTE1ZmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjMDdkMjkxNzdlYTRiYjU5YzAxODc2NjI1OTMwMzdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ5NjQzOTMwNSwgLTczLjg4NTIzODcyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjBiZjM0MjAwMDA5NGU5MDlmMTA5NTA0ODBkOTQ0ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NTRkNzIzMjA2MTE0MjVhYmRhNjUyMjNiZjI4NjI3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzU0ZDcyMzIwNjExNDI1YWJkYTY1MjIzYmYyODYyNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjg0ICg2MyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjBiZjM0MjAwMDA5NGU5MDlmMTA5NTA0ODBkOTQ0ZmYuc2V0Q29udGVudChodG1sXzc1NGQ3MjMyMDYxMTQyNWFiZGE2NTIyM2JmMjg2Mjc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjMDdkMjkxNzdlYTRiYjU5YzAxODc2NjI1OTMwMzdjLmJpbmRQb3B1cChwb3B1cF8yMGJmMzQyMDAwMDk0ZTkwOWYxMDk1MDQ4MGQ5NDRmZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJmZWY5OTIyMDNkNGU5N2FiYTdkMmEyOWFhMGM3OTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE2ODA5MDQyLCAtNzMuODg1NjEwNTgzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODYzODA2OWU4MTk0MDI0OGMwZjdkMGYyOGFlYjdkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1MWU3OGI0NzQ3ZjQ4MzJhM2ZkZGQxZGY5NTNjNmZiID0gJCgnPGRpdiBpZD0iaHRtbF9jNTFlNzhiNDc0N2Y0ODMyYTNmZGRkMWRmOTUzYzZmYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ODUgKDIzNyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTg2MzgwNjllODE5NDAyNDhjMGY3ZDBmMjhhZWI3ZGIuc2V0Q29udGVudChodG1sX2M1MWU3OGI0NzQ3ZjQ4MzJhM2ZkZGQxZGY5NTNjNmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyZmVmOTkyMjAzZDRlOTdhYmE3ZDJhMjlhYTBjNzk3LmJpbmRQb3B1cChwb3B1cF85ODYzODA2OWU4MTk0MDI0OGMwZjdkMGYyOGFlYjdkYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGViNjUzY2EwMmYxNGU3ZjkyMjg5ZDUyZjA1Zjc5MTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTc5NDUyNDQsIC03My44OTgxOTAwNzk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwYTk1OGU3ZmRiNzQwYjg4NjRjZWZjNWQxYjg4ODBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODFjMTEyNGQyMGM5NDRiYWI1MjcxMTczNDZhYTJjNjYgPSAkKCc8ZGl2IGlkPSJodG1sXzgxYzExMjRkMjBjOTQ0YmFiNTI3MTE3MzQ2YWEyYzY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44NiAoOTgxICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MGE5NThlN2ZkYjc0MGI4ODY0Y2VmYzVkMWI4ODgwYS5zZXRDb250ZW50KGh0bWxfODFjMTEyNGQyMGM5NDRiYWI1MjcxMTczNDZhYTJjNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGViNjUzY2EwMmYxNGU3ZjkyMjg5ZDUyZjA1Zjc5MTguYmluZFBvcHVwKHBvcHVwXzgwYTk1OGU3ZmRiNzQwYjg4NjRjZWZjNWQxYjg4ODBhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTJkOWU5MzQ0NmQ0MTFlYTdkMmNmMmY2YWFiMzExMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDI3MjE2MDYsIC03My44OTc0OTkwODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhODJiZjJjNTg2NjQ2YTRiZWI2NDY0YzFhNDdiNTRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzFhMGJmZDBjNDZkNGNmMmI0MTZjMTA0MTRmNDg5NzIgPSAkKCc8ZGl2IGlkPSJodG1sX2MxYTBiZmQwYzQ2ZDRjZjJiNDE2YzEwNDE0ZjQ4OTcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44NyAoNTY4ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTgyYmYyYzU4NjY0NmE0YmViNjQ2NGMxYTQ3YjU0ZS5zZXRDb250ZW50KGh0bWxfYzFhMGJmZDBjNDZkNGNmMmI0MTZjMTA0MTRmNDg5NzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmEyZDllOTM0NDZkNDExZWE3ZDJjZjJmNmFhYjMxMTEuYmluZFBvcHVwKHBvcHVwXzlhODJiZjJjNTg2NjQ2YTRiZWI2NDY0YzFhNDdiNTRlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jM2RmMTMzYTQ2YWU0YzM2YWFmNjI0OGMyYTgyNDE5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDg2NTM3NTgsIC03My44OTE4NzgyOTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1MWMxOGYwNjJiMzQ4ZmJhNTI3ODQ4M2FiMzE0NjgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDQzYzhiYzEyZDkwNDE3MGI0MDg3MzcwOTVhNWNhY2MgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0M2M4YmMxMmQ5MDQxNzBiNDA4NzM3MDk1YTVjYWNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44OCAoMzQ5ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTFjMThmMDYyYjM0OGZiYTUyNzg0ODNhYjMxNDY4My5zZXRDb250ZW50KGh0bWxfNDQzYzhiYzEyZDkwNDE3MGI0MDg3MzcwOTVhNWNhY2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzNkZjEzM2E0NmFlNGMzNmFhZjYyNDhjMmE4MjQxOTUuYmluZFBvcHVwKHBvcHVwXzQ1MWMxOGYwNjJiMzQ4ZmJhNTI3ODQ4M2FiMzE0NjgzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWFkMTkwY2JkMWU0YzE1Yjk5ZjM0NjY2MDYxYWQzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NTE2MTkwMDUsIC03My44ODkwODc3MTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlMjcxNWJlYTgwNzQ3YjJiODE2YjdjOWFhODUwYmJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGZlMmEwZDYzNjkyNDE5NjhmOTIxYzliOTZmNjU5ZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzBmZTJhMGQ2MzY5MjQxOTY4ZjkyMWM5Yjk2ZjY1OWU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij44OSAoMjA4ICBmdCkgPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTI3MTViZWE4MDc0N2IyYjgxNmI3YzlhYTg1MGJiYS5zZXRDb250ZW50KGh0bWxfMGZlMmEwZDYzNjkyNDE5NjhmOTIxYzliOTZmNjU5ZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGVhZDE5MGNiZDFlNGMxNWI5OWYzNDY2NjA2MWFkM2YuYmluZFBvcHVwKHBvcHVwXzJlMjcxNWJlYTgwNzQ3YjJiODE2YjdjOWFhODUwYmJhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzcwZGVhM2E3ZGE0ZjcwYTBiNWI0NGUyNTE1MjNjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NTI1NzA2NiwgLTczLjg4ODE1NjMyMDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzNhMmUxNmVhOTI3NGIyYTljYTc1YmY2MmQ3MjhhOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDEzMGZiNjI3MjI0YmRjODg1YmZhYjk4MzcxOTNhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQxMzBmYjYyNzIyNGJkYzg4NWJmYWI5ODM3MTkzYTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjkwICgxNDYgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczYTJlMTZlYTkyNzRiMmE5Y2E3NWJmNjJkNzI4YTk2LnNldENvbnRlbnQoaHRtbF8yNDEzMGZiNjI3MjI0YmRjODg1YmZhYjk4MzcxOTNhNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzcwZGVhM2E3ZGE0ZjcwYTBiNWI0NGUyNTE1MjNjNi5iaW5kUG9wdXAocG9wdXBfNzNhMmUxNmVhOTI3NGIyYTljYTc1YmY2MmQ3MjhhOTYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5ZjJkNThiM2RlMzRjZjRiMjI1MTJmNDA1ZmE1ZWQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU1MzU0OTY4NiwgLTczLjg4NzIyNDkxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jODQ4ZDk4OWU1ODU0M2E3YmNlMDE2MzA1OTA3YTVkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4NWJiZWJjNzllMDQxYzdhOWEzMjVmMGU5NGYzNDhiID0gJCgnPGRpdiBpZD0iaHRtbF83ODViYmViYzc5ZTA0MWM3YTlhMzI1ZjBlOTRmMzQ4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTEgKDE0NiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg0OGQ5ODllNTg1NDNhN2JjZTAxNjMwNTkwN2E1ZDMuc2V0Q29udGVudChodG1sXzc4NWJiZWJjNzllMDQxYzdhOWEzMjVmMGU5NGYzNDhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5ZjJkNThiM2RlMzRjZjRiMjI1MTJmNDA1ZmE1ZWQxLmJpbmRQb3B1cChwb3B1cF9jODQ4ZDk4OWU1ODU0M2E3YmNlMDE2MzA1OTA3YTVkMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjhkMGY1MDg1Mzk5NDUwY2I3MWQ2Y2E0NWNiYTVkODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYyMzMwMjk1LCAtNzMuODc4ODYwMjIwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNTA3YWEwYWI1OTQ0ZmMzOTFlNzE5YjRjMjcyN2YyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmZTBlNGYzYjllNTRiYTg5OGRjOTNjY2FmYmZlNGYzID0gJCgnPGRpdiBpZD0iaHRtbF9iZmUwZTRmM2I5ZTU0YmE4OThkYzkzY2NhZmJmZTRmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTIgKDIwNyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDUwN2FhMGFiNTk0NGZjMzkxZTcxOWI0YzI3MjdmMjIuc2V0Q29udGVudChodG1sX2JmZTBlNGYzYjllNTRiYTg5OGRjOTNjY2FmYmZlNGYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4ZDBmNTA4NTM5OTQ1MGNiNzFkNmNhNDVjYmE1ZDg0LmJpbmRQb3B1cChwb3B1cF9kNTA3YWEwYWI1OTQ0ZmMzOTFlNzE5YjRjMjcyN2YyMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjUzMDU3YzUwODc1NGRhZDhiZWE3MTc0YTM4ZTNlZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYzMzA4NTc4LCAtNzMuODc3OTI4NzkxMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYjQzMjhlNTAwNDI0ZjEyOTU3NDcyYzYwYTFkZWEyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlYTQyYTkxMTM3ZjQzY2FiNTg3YzRhYzNlZDQ5ZDMxID0gJCgnPGRpdiBpZD0iaHRtbF9hZWE0MmE5MTEzN2Y0M2NhYjU4N2M0YWMzZWQ0OWQzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+OTMgKDIwNiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmI0MzI4ZTUwMDQyNGYxMjk1NzQ3MmM2MGExZGVhMjcuc2V0Q29udGVudChodG1sX2FlYTQyYTkxMTM3ZjQzY2FiNTg3YzRhYzNlZDQ5ZDMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y1MzA1N2M1MDg3NTRkYWQ4YmVhNzE3NGEzOGUzZWRlLmJpbmRQb3B1cChwb3B1cF9iYjQzMjhlNTAwNDI0ZjEyOTU3NDcyYzYwYTFkZWEyNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDhkNzI5MGNhOTE1NGIwZGIyZWM5OGMzNTMzODg1MTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2MjQyOTgsIC03My44NzUxMzgwOTQyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiYjhiNjIzY2IwYjQ5Yjk4MWFmNTAxODI0ZWQzNmE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTRmMjcyZjU1ZWQ5NDhlMDllZmM3MzBmNDcwODJmMDYgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ZjI3MmY1NWVkOTQ4ZTA5ZWZjNzMwZjQ3MDgyZjA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij45NCAoNTAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiYjhiNjIzY2IwYjQ5Yjk4MWFmNTAxODI0ZWQzNmE1LnNldENvbnRlbnQoaHRtbF81NGYyNzJmNTVlZDk0OGUwOWVmYzczMGY0NzA4MmYwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OGQ3MjkwY2E5MTU0YjBkYjJlYzk4YzM1MzM4ODUxMC5iaW5kUG9wdXAocG9wdXBfMWJiOGI2MjNjYjBiNDliOTgxYWY1MDE4MjRlZDM2YTUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlMWVkNTA5MmJiMDQ2Zjc5ZmM4MzgzYmM5MDg0MzRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ3MTI0ODc3OSwgLTczLjg4ODY3NTIzNDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTk5YzA4MjhlNTM1NGE5NDkxOWY3OTIyYzk4MmIxYmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MmU1OTU2NTU2MzI0YmExYTU3ZTM1YjBhNjY2MmZhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTJlNTk1NjU1NjMyNGJhMWE1N2UzNWIwYTY2NjJmYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjk1ICgyNDggIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5OWMwODI4ZTUzNTRhOTQ5MTlmNzkyMmM5ODJiMWJkLnNldENvbnRlbnQoaHRtbF81MmU1OTU2NTU2MzI0YmExYTU3ZTM1YjBhNjY2MmZhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZTFlZDUwOTJiYjA0NmY3OWZjODM4M2JjOTA4NDM0Yy5iaW5kUG9wdXAocG9wdXBfYTk5YzA4MjhlNTM1NGE5NDkxOWY3OTIyYzk4MmIxYmQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyMDcwNWJiMGQ3NTRiZjliY2MxMzI5MDY4NTBlN2FlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4MjA2OTU4MSwgLTczLjg3ODQ1NjE2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDMxOGY5MGU3YzVmNDkxNjhmOWNkY2VjMDA2YzgxODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Yjc5Y2U4MzU2MGU0MWQ1YWQ1ZWFkYzhjMmRiMjMxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfOGI3OWNlODM1NjBlNDFkNWFkNWVhZGM4YzJkYjIzMTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjk2ICgzNzAgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzMThmOTBlN2M1ZjQ5MTY4ZjljZGNlYzAwNmM4MTg5LnNldENvbnRlbnQoaHRtbF84Yjc5Y2U4MzU2MGU0MWQ1YWQ1ZWFkYzhjMmRiMjMxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MjA3MDViYjBkNzU0YmY5YmNjMTMyOTA2ODUwZTdhZS5iaW5kUG9wdXAocG9wdXBfZDMxOGY5MGU3YzVmNDkxNjhmOWNkY2VjMDA2YzgxODkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyZmJjMjc0NTk5ODRiZTViNzE1OTkyYTYzMjYwZTBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ3OTE4ODA5NSwgLTczLjg4MTEzNDYwNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ3ODNjZGFiYWYxNDhhOWEwZGJmYWNhYmI1YjEyY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDc1ZmViMGE5YjI0OGRlYmI1OWNhOGQwOWM0NDZlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfODQ3NWZlYjBhOWIyNDhkZWJiNTljYThkMDljNDQ2ZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjk3ICgzOTIgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkNzgzY2RhYmFmMTQ4YTlhMGRiZmFjYWJiNWIxMmNjLnNldENvbnRlbnQoaHRtbF84NDc1ZmViMGE5YjI0OGRlYmI1OWNhOGQwOWM0NDZlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MmZiYzI3NDU5OTg0YmU1YjcxNTk5MmE2MzI2MGUwYi5iaW5kUG9wdXAocG9wdXBfZmQ3ODNjZGFiYWYxNDhhOWEwZGJmYWNhYmI1YjEyY2MpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdlMzM3OWU5ZmYwNTQ4ZGJhYzQxOWI0ZmNhYWU0NzczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUzNjI0NTM3MiwgLTczLjg4NTk2NDU3MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODYwZjVhMzI3OGViNGNjNThjZjZhNTI0Yjk5NGE5YmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZTBiMzcyMjI5MTk0Yzg5YmVlZDE5M2QxNGIwNTRhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmUwYjM3MjIyOTE5NGM4OWJlZWQxOTNkMTRiMDU0YTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjk4ICgxODkgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2MGY1YTMyNzhlYjRjYzU4Y2Y2YTUyNGI5OTRhOWJhLnNldENvbnRlbnQoaHRtbF9mZTBiMzcyMjI5MTk0Yzg5YmVlZDE5M2QxNGIwNTRhMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZTMzNzllOWZmMDU0OGRiYWM0MTliNGZjYWFlNDc3My5iaW5kUG9wdXAocG9wdXBfODYwZjVhMzI3OGViNGNjNThjZjZhNTI0Yjk5NGE5YmEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzNzBmMmY3ODcxNDRmNGI5ZTQyODAwODA3MzJkYmQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ5NjQzOTMwNSwgLTczLjg4NTIzODcyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMWM4NDFhZjQxYjU0NDI3ZGIyY2MxNzcxYjNiYzVlMjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QzOGVmMTEwNzAwNGZmYjk5ZTA5Y2Y0OWYzYTE3ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCcKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZmZmNmQyYWUxNzA0YjBjOGEwMjViNWFmMGZhOWZmMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGZmZjZkMmFlMTcwNGIwYzhhMDI1YjVhZjBmYTlmZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjk5ICg2MyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2QzOGVmMTEwNzAwNGZmYjk5ZTA5Y2Y0OWYzYTE3ZmYuc2V0Q29udGVudChodG1sXzBmZmY2ZDJhZTE3MDRiMGM4YTAyNWI1YWYwZmE5ZmYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzNzBmMmY3ODcxNDRmNGI5ZTQyODAwODA3MzJkYmQzLmJpbmRQb3B1cChwb3B1cF9jZDM4ZWYxMTA3MDA0ZmZiOTllMDljZjQ5ZjNhMTdmZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWEwM2I5NDFkYjU5NDVlZmFlODgzMGI2YTM2NmJkNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDkxNTQ0Mjc5LCAtNzMuODg5OTAyNTUwOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mM2NjNDQyODQ3MTQ0ZTIwYjljZDQ1YzIxODUwODRjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwZTYwNzk1OWE5NDRjMjU4NzcxYmUzNGU0ZWFjMWUzID0gJCgnPGRpdiBpZD0iaHRtbF9hMGU2MDc5NTlhOTQ0YzI1ODc3MWJlMzRlNGVhYzFlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTAwICgxNjkgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzY2M0NDI4NDcxNDRlMjBiOWNkNDVjMjE4NTA4NGNkLnNldENvbnRlbnQoaHRtbF9hMGU2MDc5NTlhOTQ0YzI1ODc3MWJlMzRlNGVhYzFlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTAzYjk0MWRiNTk0NWVmYWU4ODMwYjZhMzY2YmQ2Yy5iaW5kUG9wdXAocG9wdXBfZjNjYzQ0Mjg0NzE0NGUyMGI5Y2Q0NWMyMTg1MDg0Y2QpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0N2RjNzFiZGFhZTQxOWRhZTU1NmFjOTM3YzJhZDczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ5MjQ5NjAzNCwgLTczLjg4ODk3NDg0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ODBjZjQwYmEyYjg0YTkxOTMwNjQ5Mzc1YzA4ZjI1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3Njc5M2U4NzFlMTRjOTdhNDAyY2QxYWUxZWRjYjg4ID0gJCgnPGRpdiBpZD0iaHRtbF9kNzY3OTNlODcxZTE0Yzk3YTQwMmNkMWFlMWVkY2I4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTAxICg4NyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDgwY2Y0MGJhMmI4NGE5MTkzMDY0OTM3NWMwOGYyNWQuc2V0Q29udGVudChodG1sX2Q3Njc5M2U4NzFlMTRjOTdhNDAyY2QxYWUxZWRjYjg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0N2RjNzFiZGFhZTQxOWRhZTU1NmFjOTM3YzJhZDczLmJpbmRQb3B1cChwb3B1cF80ODBjZjQwYmEyYjg0YTkxOTMwNjQ5Mzc1YzA4ZjI1ZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU3MGU3N2M1NGU5NGQwNThjOGRlMDY1YWMzNThhMTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDkzNDc0OTUyLCAtNzMuODg4MDI1NDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDMyODc3M2M2MDY0N2ZiYWU4ZjFkZjk5NTQ2MmMxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4Nzg5ZDVhZTcxZTQ4MjM5MjQ2ZjcxNjU2ZGM4ZDk2ID0gJCgnPGRpdiBpZD0iaHRtbF8zODc4OWQ1YWU3MWU0ODIzOTI0NmY3MTY1NmRjOGQ5NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTAyICg5MyAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjQzMjg3NzNjNjA2NDdmYmFlOGYxZGY5OTU0NjJjMTYuc2V0Q29udGVudChodG1sXzM4Nzg5ZDVhZTcxZTQ4MjM5MjQ2ZjcxNjU2ZGM4ZDk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllNzBlNzdjNTRlOTRkMDU4YzhkZTA2NWFjMzU4YTE2LmJpbmRQb3B1cChwb3B1cF9mNDMyODc3M2M2MDY0N2ZiYWU4ZjFkZjk5NTQ2MmMxNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjBkYjU5OTVkYWYyNGE2N2JkMmM2YmQyN2NmMzQ3ZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTI4NDM5MTM2LCAtNzMuODkzMzk3NDg4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMTIwNDVmMzJjOTI0ODIyYjZiM2QxYTMwNTBkYTk2ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlMTUxYTU0NzJiMDQ2M2VhMWNlOTljMmVkYmJhZTVjID0gJCgnPGRpdiBpZD0iaHRtbF80ZTE1MWE1NDcyYjA0NjNlYTFjZTk5YzJlZGJiYWU1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTAzICg2NiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzEyMDQ1ZjMyYzkyNDgyMmI2YjNkMWEzMDUwZGE5NmYuc2V0Q29udGVudChodG1sXzRlMTUxYTU0NzJiMDQ2M2VhMWNlOTljMmVkYmJhZTVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwZGI1OTk1ZGFmMjRhNjdiZDJjNmJkMjdjZjM0N2VlLmJpbmRQb3B1cChwb3B1cF9jMTIwNDVmMzJjOTI0ODIyYjZiM2QxYTMwNTBkYTk2ZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2UyZDdmOTllM2QzNDFlNWIxOGVjYjQ5OTBmY2UwODkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTI5MzkxMjA3LCAtNzMuODkyNDczMzQ5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOWI1MjVlOWYxN2U0OGZlOWU5ZTFlOWNhOGU1MmJkNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1MGIwNGQ3MTgxMDRkNmQ5MGFkMjg3Y2VkYmUyMGEzID0gJCgnPGRpdiBpZD0iaHRtbF8wNTBiMDRkNzE4MTA0ZDZkOTBhZDI4N2NlZGJlMjBhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTA0ICg2NiAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTliNTI1ZTlmMTdlNDhmZTllOWUxZTljYThlNTJiZDQuc2V0Q29udGVudChodG1sXzA1MGIwNGQ3MTgxMDRkNmQ5MGFkMjg3Y2VkYmUyMGEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdlMmQ3Zjk5ZTNkMzQxZTViMThlY2I0OTkwZmNlMDg5LmJpbmRQb3B1cChwb3B1cF8xOWI1MjVlOWYxN2U0OGZlOWU5ZTFlOWNhOGU1MmJkNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTg2ODg3MGVhYWQwNDU4MTgxYzVhNDM4ZDEzOTQ0ZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ4OTY0Nzk1LCAtNzMuODczODc4MDMzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xYzg0MWFmNDFiNTQ0MjdkYjJjYzE3NzFiM2JjNWUyOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjRiMDc3ODhjYWM0ZTQ2YjU0NDJlYzk4MWUyZWYxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2ZjI1YTJjMGRmNTRkYWE4MDUxYTFiNmRmYThjZjVhID0gJCgnPGRpdiBpZD0iaHRtbF8zNmYyNWEyYzBkZjU0ZGFhODA1MWExYjZkZmE4Y2Y1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+MTA1ICgxNDUgIGZ0KSA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhiNGIwNzc4OGNhYzRlNDZiNTQ0MmVjOTgxZTJlZjE5LnNldENvbnRlbnQoaHRtbF8zNmYyNWEyYzBkZjU0ZGFhODA1MWExYjZkZmE4Y2Y1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hODY4ODcwZWFhZDA0NTgxODFjNWE0MzhkMTM5NDRmNS5iaW5kUG9wdXAocG9wdXBfOGI0YjA3Nzg4Y2FjNGU0NmI1NDQyZWM5ODFlMmVmMTkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyNTkzZTExYWU1NDQ4MDE5MGY3YTkzN2QzZGRkNmUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0Nzk4Njg0NywgLTczLjg3NDgwOTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzFjODQxYWY0MWI1NDQyN2RiMmNjMTc3MWIzYmM1ZTI5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2M2Y3ODMwNDhiODQzNWQ4ZDhmZjUyN2FlYjM2MDc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzgyNDhjZmE5NzFjNDg1Yjk4ODkxN2U4ZmQ2M2UyNWEgPSAkKCc8ZGl2IGlkPSJodG1sX2M4MjQ4Y2ZhOTcxYzQ4NWI5ODg5MTdlOGZkNjNlMjVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij4xMDYgKDE0NSAgZnQpIDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTYzZjc4MzA0OGI4NDM1ZDhkOGZmNTI3YWViMzYwNzYuc2V0Q29udGVudChodG1sX2M4MjQ4Y2ZhOTcxYzQ4NWI5ODg5MTdlOGZkNjNlMjVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyNTkzZTExYWU1NDQ4MDE5MGY3YTkzN2QzZGRkNmUyLmJpbmRQb3B1cChwb3B1cF81NjNmNzgzMDQ4Yjg0MzVkOGQ4ZmY1MjdhZWIzNjA3NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## How long does it take on all schools in the city?"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def school_dist(point):\n return schools.geometry.distance(point).min()\n\nmin_distance = lpis_g.geometry.apply(lambda x: school_dist(x))",
"execution_count": 25,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "schools.shape",
"execution_count": 26,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 26,
"data": {
"text/plain": "(1821, 9)"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lpis_g.shape",
"execution_count": 27,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 27,
"data": {
"text/plain": "(3019, 6)"
},
"metadata": {}
}
]
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"name": "python3",
"display_name": "Python [default]",
"language": "python"
},
"varInspector": {
"window_display": true,
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"library": "var_list.py",
"delete_cmd_prefix": "del ",
"delete_cmd_postfix": "",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"library": "var_list.r",
"delete_cmd_prefix": "rm(",
"delete_cmd_postfix": ") ",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"oldHeight": 122,
"varInspector_section_display": "none",
"position": {
"left": "1650px",
"top": "120px",
"width": "250px",
"height": "40px",
"right": "20px"
}
},
"language_info": {
"name": "python",
"version": "3.6.6",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"gist": {
"id": "",
"data": {
"description": "E/GitHub/GeoPanLearn/traffic/Untitled2.ipynb",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment