Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save edisoncastro01/6d2a8006a330e267bc0a44d02f3d90d0 to your computer and use it in GitHub Desktop.
Save edisoncastro01/6d2a8006a330e267bc0a44d02f3d90d0 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n",
"\n",
"<h1 align=center><font size = 5>Segmenting and Clustering Neighborhoods in New York City</font></h1>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"In this lab, you will learn how to convert addresses into their equivalent latitude and longitude values. Also, you will use the Foursquare API to explore neighborhoods in New York City. You will use the **explore** function to get the most common venue categories in each neighborhood, and then use this feature to group the neighborhoods into clusters. You will use the _k_-means clustering algorithm to complete this task. Finally, you will use the Folium library to visualize the neighborhoods in New York City and their emerging clusters.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"<font size = 3>\n",
"\n",
"1. <a href=\"#item1\">Download and Explore Dataset</a>\n",
"\n",
"2. <a href=\"#item2\">Explore Neighborhoods in New York City</a>\n",
"\n",
"3. <a href=\"#item3\">Analyze Each Neighborhood</a>\n",
"\n",
"4. <a href=\"#item4\">Cluster Neighborhoods</a>\n",
"\n",
"5. <a href=\"#item5\">Examine Clusters</a> \n",
" </font>\n",
" </div>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we get the data and start exploring it, let's download all the dependencies that we will need.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda/envs/python\n",
"\n",
" added / updated specs:\n",
" - geopy\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" geographiclib-1.50 | py_0 34 KB conda-forge\n",
" geopy-2.1.0 | pyhd3deb0d_0 64 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 98 KB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" geographiclib conda-forge/noarch::geographiclib-1.50-py_0\n",
" geopy conda-forge/noarch::geopy-2.1.0-pyhd3deb0d_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"geopy-2.1.0 | 64 KB | ##################################### | 100% \n",
"geographiclib-1.50 | 34 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n",
"Libraries imported.\n"
]
}
],
"source": [
"import numpy as np # library to handle data in a vectorized manner\n",
"\n",
"import pandas as pd # library for data analsysis\n",
"pd.set_option('display.max_columns', None)\n",
"pd.set_option('display.max_rows', None)\n",
"\n",
"import json # library to handle JSON files\n",
"\n",
"!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"\n",
"import requests # library to handle requests\n",
"from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\n",
"\n",
"#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"import folium # map rendering library\n",
"\n",
"print('Libraries imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item1'></a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Download and Explore Dataset\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Neighborhood has a total of 5 boroughs and 306 neighborhoods. In order to segement the neighborhoods and explore them, we will essentially need a dataset that contains the 5 boroughs and the neighborhoods that exist in each borough as well as the the latitude and logitude coordinates of each neighborhood. \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For your convenience, I downloaded the files and placed it on the server, so you can simply run a `wget` command and access the data. So let's go ahead and do that.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'newyork_data.json' https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-DS0701EN-SkillsNetwork/labs/newyork_data.json\n",
"print('Data downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Load and explore the data\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's load the data.\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"with open('newyork_data.json') as json_data:\n",
" newyork_data = json.load(json_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a quick look at the data.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'FeatureCollection',\n",
" 'totalFeatures': 306,\n",
" 'features': [{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.2',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82993910812398, 40.87429419303012]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Co-op City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Co-op',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82993910812398,\n",
" 40.87429419303012,\n",
" -73.82993910812398,\n",
" 40.87429419303012]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.3',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82780644716412, 40.887555677350775]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eastchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eastchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82780644716412,\n",
" 40.887555677350775,\n",
" -73.82780644716412,\n",
" 40.887555677350775]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.4',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90564259591682, 40.89543742690383]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fieldston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fieldston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90564259591682,\n",
" 40.89543742690383,\n",
" -73.90564259591682,\n",
" 40.89543742690383]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.5',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9125854610857, 40.890834493891305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Riverdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Riverdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9125854610857,\n",
" 40.890834493891305,\n",
" -73.9125854610857,\n",
" 40.890834493891305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.6',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90281798724604, 40.88168737120521]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90281798724604,\n",
" 40.88168737120521,\n",
" -73.90281798724604,\n",
" 40.88168737120521]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.7',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91065965862981, 40.87655077879964]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Marble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.91065965862981,\n",
" 40.87655077879964,\n",
" -73.91065965862981,\n",
" 40.87655077879964]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.8',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86731496814176, 40.89827261213805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodlawn',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodlawn',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86731496814176,\n",
" 40.89827261213805,\n",
" -73.86731496814176,\n",
" 40.89827261213805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.9',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8793907395681, 40.87722415599446]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Norwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Norwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8793907395681,\n",
" 40.87722415599446,\n",
" -73.8793907395681,\n",
" 40.87722415599446]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.10',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85744642974207, 40.88103887819211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85744642974207,\n",
" 40.88103887819211,\n",
" -73.85744642974207,\n",
" 40.88103887819211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.11',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83579759808117, 40.866858107252696]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Baychester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Baychester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.83579759808117,\n",
" 40.866858107252696,\n",
" -73.83579759808117,\n",
" 40.866858107252696]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.12',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85475564017999, 40.85741349808865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Parkway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pelham Parkway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85475564017999,\n",
" 40.85741349808865,\n",
" -73.85475564017999,\n",
" 40.85741349808865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.13',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78648845267413, 40.84724670491813]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.78648845267413,\n",
" 40.84724670491813,\n",
" -73.78648845267413,\n",
" 40.84724670491813]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.14',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8855121841913, 40.870185164975325]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bedford',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8855121841913,\n",
" 40.870185164975325,\n",
" -73.8855121841913,\n",
" 40.870185164975325]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.15',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9104159619131, 40.85572707719664]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'University Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'University',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9104159619131,\n",
" 40.85572707719664,\n",
" -73.9104159619131,\n",
" 40.85572707719664]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.16',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91967159119565, 40.84789792606271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morris',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91967159119565,\n",
" 40.84789792606271,\n",
" -73.91967159119565,\n",
" 40.84789792606271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.17',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89642655981623, 40.86099679638654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fordham',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fordham',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.89642655981623,\n",
" 40.86099679638654,\n",
" -73.89642655981623,\n",
" 40.86099679638654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.18',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88735617532338, 40.84269615786053]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Tremont',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Tremont',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88735617532338,\n",
" 40.84269615786053,\n",
" -73.88735617532338,\n",
" 40.84269615786053]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.19',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87774474910545, 40.83947505672653]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Farms',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Farms',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.87774474910545,\n",
" 40.83947505672653,\n",
" -73.87774474910545,\n",
" 40.83947505672653]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.20',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9261020935813, 40.836623010706056]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'High Bridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Highbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9261020935813,\n",
" 40.836623010706056,\n",
" -73.9261020935813,\n",
" 40.836623010706056]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.21',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90942160757436, 40.819754370594936]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Melrose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Melrose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90942160757436,\n",
" 40.819754370594936,\n",
" -73.90942160757436,\n",
" 40.819754370594936]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.22',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91609987487575, 40.80623874935177]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mott Haven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Mott Haven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91609987487575,\n",
" 40.80623874935177,\n",
" -73.91609987487575,\n",
" 40.80623874935177]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.23',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91322139386135, 40.801663627756206]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Morris',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Morris',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91322139386135,\n",
" 40.801663627756206,\n",
" -73.91322139386135,\n",
" 40.801663627756206]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.24',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8957882009446, 40.81509904545822]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Longwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Longwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8957882009446,\n",
" 40.81509904545822,\n",
" -73.8957882009446,\n",
" 40.81509904545822]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.25',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88331505955291, 40.80972987938709]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunts Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunts',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88331505955291,\n",
" 40.80972987938709,\n",
" -73.88331505955291,\n",
" 40.80972987938709]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.26',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90150648943059, 40.82359198585534]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morrisania',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morrisania',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90150648943059,\n",
" 40.82359198585534,\n",
" -73.90150648943059,\n",
" 40.82359198585534]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.27',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86574609554924, 40.821012197914015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soundview',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soundview',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86574609554924,\n",
" 40.821012197914015,\n",
" -73.86574609554924,\n",
" 40.821012197914015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.28',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85414416189266, 40.80655112003589]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clason Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clason',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85414416189266,\n",
" 40.80655112003589,\n",
" -73.85414416189266,\n",
" 40.80655112003589]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.29',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81635002158441, 40.81510925804005]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Throgs Neck',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Throgs Neck',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81635002158441,\n",
" 40.81510925804005,\n",
" -73.81635002158441,\n",
" 40.81510925804005]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.30',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8240992675385, 40.844245936947374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Country Club',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Country',\n",
" 'annoline2': 'Club',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8240992675385,\n",
" 40.844245936947374,\n",
" -73.8240992675385,\n",
" 40.844245936947374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.31',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85600310535783, 40.837937822267286]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Parkchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Parkchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85600310535783,\n",
" 40.837937822267286,\n",
" -73.85600310535783,\n",
" 40.837937822267286]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.32',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84219407604444, 40.8406194964327]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westchester Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Westchester',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84219407604444,\n",
" 40.8406194964327,\n",
" -73.84219407604444,\n",
" 40.8406194964327]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.33',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8662991807561, 40.84360847124718]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Van Nest',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Van',\n",
" 'annoline2': 'Nest',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8662991807561,\n",
" 40.84360847124718,\n",
" -73.8662991807561,\n",
" 40.84360847124718]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.34',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85040178030421, 40.847549063536334]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morris Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85040178030421,\n",
" 40.847549063536334,\n",
" -73.85040178030421,\n",
" 40.847549063536334]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.35',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88845196134804, 40.85727710073895]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belmont',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belmont',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88845196134804,\n",
" 40.85727710073895,\n",
" -73.88845196134804,\n",
" 40.85727710073895]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.36',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91719048210393, 40.88139497727086]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Spuyten Duyvil',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Spuyten',\n",
" 'annoline2': 'Duyvil',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91719048210393,\n",
" 40.88139497727086,\n",
" -73.91719048210393,\n",
" 40.88139497727086]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.37',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90453054908927, 40.90854282950666]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Riverdale',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Riverdale',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90453054908927,\n",
" 40.90854282950666,\n",
" -73.90453054908927,\n",
" 40.90854282950666]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.38',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8320737824047, 40.85064140940335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8320737824047,\n",
" 40.85064140940335,\n",
" -73.8320737824047,\n",
" 40.85064140940335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.39',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82620275994073, 40.82657951686922]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Schuylerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Schuylerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82620275994073,\n",
" 40.82657951686922,\n",
" -73.82620275994073,\n",
" 40.82657951686922]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.40',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81388514428619, 40.821986118163494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgewater Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Edgewater',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81388514428619,\n",
" 40.821986118163494,\n",
" -73.81388514428619,\n",
" 40.821986118163494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.41',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84802729582735, 40.819014376988314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castle Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castle',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84802729582735,\n",
" 40.819014376988314,\n",
" -73.84802729582735,\n",
" 40.819014376988314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.42',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86332361652777, 40.87137078192371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Olinville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Olinville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86332361652777,\n",
" 40.87137078192371,\n",
" -73.86332361652777,\n",
" 40.87137078192371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.43',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84161194831223, 40.86296562477998]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84161194831223,\n",
" 40.86296562477998,\n",
" -73.84161194831223,\n",
" 40.86296562477998]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.44',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91558941773444, 40.83428380733851]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91558941773444,\n",
" 40.83428380733851,\n",
" -73.91558941773444,\n",
" 40.83428380733851]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.45',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85053524451935, 40.82977429787161]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Unionport',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Unionport',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85053524451935,\n",
" 40.82977429787161,\n",
" -73.85053524451935,\n",
" 40.82977429787161]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.46',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84808271877168, 40.88456130303732]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edenwald',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edenwald',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84808271877168,\n",
" 40.88456130303732,\n",
" -73.84808271877168,\n",
" 40.88456130303732]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.47',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03062069353813, 40.625801065010656]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Ridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bay Ridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03062069353813,\n",
" 40.625801065010656,\n",
" -74.03062069353813,\n",
" 40.625801065010656]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.48',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99517998380729, 40.61100890202044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bensonhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bensonhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99517998380729,\n",
" 40.61100890202044,\n",
" -73.99517998380729,\n",
" 40.61100890202044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.49',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01031618527784, 40.64510294925429]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunset Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunset',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01031618527784,\n",
" 40.64510294925429,\n",
" -74.01031618527784,\n",
" 40.64510294925429]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.50',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95424093127393, 40.7302009848647]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenpoint',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenpoint',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95424093127393,\n",
" 40.7302009848647,\n",
" -73.95424093127393,\n",
" 40.7302009848647]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.51',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97347087708445, 40.59526001306593]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gravesend',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gravesend',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97347087708445,\n",
" 40.59526001306593,\n",
" -73.97347087708445,\n",
" 40.59526001306593]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.52',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96509448785336, 40.57682506566604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brighton Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brighton',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96509448785336,\n",
" 40.57682506566604,\n",
" -73.96509448785336,\n",
" 40.57682506566604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.53',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94318640482979, 40.58689012678384]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sheepshead Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sheepshead',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94318640482979,\n",
" 40.58689012678384,\n",
" -73.94318640482979,\n",
" 40.58689012678384]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.54',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95743840559939, 40.61443251335098]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95743840559939,\n",
" 40.61443251335098,\n",
" -73.95743840559939,\n",
" 40.61443251335098]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.55',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95840106533903, 40.63632589026677]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95840106533903,\n",
" 40.63632589026677,\n",
" -73.95840106533903,\n",
" 40.63632589026677]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.56',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94329119073582, 40.67082917695294]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Crown Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Crown',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94329119073582,\n",
" 40.67082917695294,\n",
" -73.94329119073582,\n",
" 40.67082917695294]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.57',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93610256185836, 40.64171776668961]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93610256185836,\n",
" 40.64171776668961,\n",
" -73.93610256185836,\n",
" 40.64171776668961]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.58',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98042110559474, 40.642381958003526]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kensington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kensington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98042110559474,\n",
" 40.642381958003526,\n",
" -73.98042110559474,\n",
" 40.642381958003526]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.59',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98007340430172, 40.65694583575104]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Windsor Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Windsor',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98007340430172,\n",
" 40.65694583575104,\n",
" -73.98007340430172,\n",
" 40.65694583575104]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.60',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9648592426269, 40.676822262254724]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9648592426269,\n",
" 40.676822262254724,\n",
" -73.9648592426269,\n",
" 40.676822262254724]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.61',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91023536176607, 40.66394994339755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brownsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brownsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91023536176607,\n",
" 40.66394994339755,\n",
" -73.91023536176607,\n",
" 40.66394994339755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.62',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95811529220927, 40.70714439344251]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsburg',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsburg',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95811529220927,\n",
" 40.70714439344251,\n",
" -73.95811529220927,\n",
" 40.70714439344251]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.63',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92525797487045, 40.69811611017901]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bushwick',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bushwick',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92525797487045,\n",
" 40.69811611017901,\n",
" -73.92525797487045,\n",
" 40.69811611017901]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.64',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94178488690297, 40.687231607720456]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Stuyvesant',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bedford Stuyvesant',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94178488690297,\n",
" 40.687231607720456,\n",
" -73.94178488690297,\n",
" 40.687231607720456]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.65',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99378225496424, 40.695863722724084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brooklyn Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brooklyn',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99378225496424,\n",
" 40.695863722724084,\n",
" -73.99378225496424,\n",
" 40.695863722724084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.66',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99856139218463, 40.687919722485574]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cobble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cobble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99856139218463,\n",
" 40.687919722485574,\n",
" -73.99856139218463,\n",
" 40.687919722485574]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.67',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99465372828006, 40.680540231076485]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carroll Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carroll',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99465372828006,\n",
" 40.680540231076485,\n",
" -73.99465372828006,\n",
" 40.680540231076485]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.68',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0127589747356, 40.676253230250886]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Red Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Red',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0127589747356,\n",
" 40.676253230250886,\n",
" -74.0127589747356,\n",
" 40.676253230250886]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.69',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99444087145339, 40.673931143187154]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gowanus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gowanus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99444087145339,\n",
" 40.673931143187154,\n",
" -73.99444087145339,\n",
" 40.673931143187154]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.70',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97290574369092, 40.68852726018977]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Greene',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Greene',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97290574369092,\n",
" 40.68852726018977,\n",
" -73.97290574369092,\n",
" 40.68852726018977]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.71',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705030183924, 40.67232052268197]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Slope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Slope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97705030183924,\n",
" 40.67232052268197,\n",
" -73.97705030183924,\n",
" 40.67232052268197]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.72',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87661596457296, 40.68239101144211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cypress Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cypress',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87661596457296,\n",
" 40.68239101144211,\n",
" -73.87661596457296,\n",
" 40.68239101144211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.73',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88069863917366, 40.669925700847045]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East New York',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East New York',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88069863917366,\n",
" 40.669925700847045,\n",
" -73.88069863917366,\n",
" 40.669925700847045]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.74',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87936970045875, 40.64758905230874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Starrett City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Starrett',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87936970045875,\n",
" 40.64758905230874,\n",
" -73.87936970045875,\n",
" 40.64758905230874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.75',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90209269778966, 40.63556432797428]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Canarsie',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Canarsie',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90209269778966,\n",
" 40.63556432797428,\n",
" -73.90209269778966,\n",
" 40.63556432797428]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.76',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92911302644674, 40.630446043757466]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatlands',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatlands',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92911302644674,\n",
" 40.630446043757466,\n",
" -73.92911302644674,\n",
" 40.630446043757466]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.77',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90818571777423, 40.606336421685626]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90818571777423,\n",
" 40.606336421685626,\n",
" -73.90818571777423,\n",
" 40.606336421685626]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.78',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94353722891886, 40.57791350308657]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94353722891886,\n",
" 40.57791350308657,\n",
" -73.94353722891886,\n",
" 40.57791350308657]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.79',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98868295821637, 40.57429256471601]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Coney Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Coney Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98868295821637,\n",
" 40.57429256471601,\n",
" -73.98868295821637,\n",
" 40.57429256471601]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.80',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99875221443519, 40.59951870282238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bath Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bath',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99875221443519,\n",
" 40.59951870282238,\n",
" -73.99875221443519,\n",
" 40.59951870282238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.81',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99049823044811, 40.633130512758015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Borough Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Borough',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99049823044811,\n",
" 40.633130512758015,\n",
" -73.99049823044811,\n",
" 40.633130512758015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.82',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01931375636022, 40.619219457722636]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dyker Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dyker',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01931375636022,\n",
" 40.619219457722636,\n",
" -74.01931375636022,\n",
" 40.619219457722636]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.83',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93010170691196, 40.590848433902046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gerritsen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Gerritsen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93010170691196,\n",
" 40.590848433902046,\n",
" -73.93010170691196,\n",
" 40.590848433902046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.84',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93134404108497, 40.609747779894604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marine Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Marine Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93134404108497,\n",
" 40.609747779894604,\n",
" -73.93134404108497,\n",
" 40.609747779894604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.85',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96784306216367, 40.693229421881504]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96784306216367,\n",
" 40.693229421881504,\n",
" -73.96784306216367,\n",
" 40.693229421881504]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.86',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0078731120024, 40.57637537890224]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sea Gate',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sea',\n",
" 'annoline2': 'Gate',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0078731120024,\n",
" 40.57637537890224,\n",
" -74.0078731120024,\n",
" 40.57637537890224]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.87',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98346337431099, 40.69084402109802]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Downtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Downtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98346337431099,\n",
" 40.69084402109802,\n",
" -73.98346337431099,\n",
" 40.69084402109802]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.88',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98374824115798, 40.685682912091444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Boerum Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Boerum',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98374824115798,\n",
" 40.685682912091444,\n",
" -73.98374824115798,\n",
" 40.685682912091444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.89',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95489867077713, 40.658420017469815]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Lefferts Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Lefferts',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95489867077713,\n",
" 40.658420017469815,\n",
" -73.95489867077713,\n",
" 40.658420017469815]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.90',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91306831787395, 40.678402554795355]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91306831787395,\n",
" 40.678402554795355,\n",
" -73.91306831787395,\n",
" 40.678402554795355]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.91',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86797598081334, 40.67856995727479]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Line',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Line',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.86797598081334,\n",
" 40.67856995727479,\n",
" -73.86797598081334,\n",
" 40.67856995727479]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.92',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89855633630317, 40.61514955045308]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bergen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bergen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.89855633630317,\n",
" 40.61514955045308,\n",
" -73.89855633630317,\n",
" 40.61514955045308]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.93',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95759523489838, 40.62559589869843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95759523489838,\n",
" 40.62559589869843,\n",
" -73.95759523489838,\n",
" 40.62559589869843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.94',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96261316716048, 40.647008603185185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Park South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Park South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96261316716048,\n",
" 40.647008603185185,\n",
" -73.96261316716048,\n",
" 40.647008603185185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.95',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91607483951324, 40.62384524478419]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Georgetown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Georgetown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91607483951324,\n",
" 40.62384524478419,\n",
" -73.91607483951324,\n",
" 40.62384524478419]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.96',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93885815269195, 40.70849241041548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Williamsburg',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Williamsburg',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93885815269195,\n",
" 40.70849241041548,\n",
" -73.93885815269195,\n",
" 40.70849241041548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.97',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95880857587582, 40.714822906532014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'North Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95880857587582,\n",
" 40.714822906532014,\n",
" -73.95880857587582,\n",
" 40.714822906532014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.98',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95800095153331, 40.71086147265064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95800095153331,\n",
" 40.71086147265064,\n",
" -73.95800095153331,\n",
" 40.71086147265064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.99',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96836678035541, 40.61305976667942]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Parkway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Parkway',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96836678035541,\n",
" 40.61305976667942,\n",
" -73.96836678035541,\n",
" 40.61305976667942]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.100',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03197914537984, 40.61476812694226]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Hamilton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Hamilton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03197914537984,\n",
" 40.61476812694226,\n",
" -74.03197914537984,\n",
" 40.61476812694226]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.101',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99427936255978, 40.71561842231432]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chinatown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chinatown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99427936255978,\n",
" 40.71561842231432,\n",
" -73.99427936255978,\n",
" 40.71561842231432]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.102',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93690027985234, 40.85190252555305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Washington Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Washington',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.93690027985234,\n",
" 40.85190252555305,\n",
" -73.93690027985234,\n",
" 40.85190252555305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.103',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92121042203897, 40.86768396449915]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Inwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Inwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.92121042203897,\n",
" 40.86768396449915,\n",
" -73.92121042203897,\n",
" 40.86768396449915]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.104',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94968791883366, 40.823604284811935]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hamilton Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hamilton',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94968791883366,\n",
" 40.823604284811935,\n",
" -73.94968791883366,\n",
" 40.823604284811935]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.105',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9573853935188, 40.8169344294978]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattanville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattanville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9573853935188,\n",
" 40.8169344294978,\n",
" -73.9573853935188,\n",
" 40.8169344294978]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.106',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94321112603905, 40.81597606742414]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Central Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Central',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94321112603905,\n",
" 40.81597606742414,\n",
" -73.94321112603905,\n",
" 40.81597606742414]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.107',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94418223148524, 40.79224946663033]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94418223148524,\n",
" 40.79224946663033,\n",
" -73.94418223148524,\n",
" 40.79224946663033]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.108',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96050763135, 40.775638573301805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96050763135,\n",
" 40.775638573301805,\n",
" -73.96050763135,\n",
" 40.775638573301805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.109',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94711784471826, 40.775929849884875]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Yorkville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Yorkville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94711784471826,\n",
" 40.775929849884875,\n",
" -73.94711784471826,\n",
" 40.775929849884875]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.110',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9588596881376, 40.76811265828733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lenox Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lenox',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9588596881376,\n",
" 40.76811265828733,\n",
" -73.9588596881376,\n",
" 40.76811265828733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.111',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94916769227953, 40.76215960576283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roosevelt Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roosevelt Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 56,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94916769227953,\n",
" 40.76215960576283,\n",
" -73.94916769227953,\n",
" 40.76215960576283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.112',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705923630603, 40.787657998534854]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper West Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'West',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97705923630603,\n",
" 40.787657998534854,\n",
" -73.97705923630603,\n",
" 40.787657998534854]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.113',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98533777001262, 40.77352888942166]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lincoln Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lincoln',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98533777001262,\n",
" 40.77352888942166,\n",
" -73.98533777001262,\n",
" 40.77352888942166]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.114',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99611936309479, 40.75910089146212]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99611936309479,\n",
" 40.75910089146212,\n",
" -73.99611936309479,\n",
" 40.75910089146212]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.115',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98166882730304, 40.75469110270623]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98166882730304,\n",
" 40.75469110270623,\n",
" -73.98166882730304,\n",
" 40.75469110270623]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.116',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97833207924127, 40.748303077252174]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97833207924127,\n",
" 40.748303077252174,\n",
" -73.97833207924127,\n",
" 40.748303077252174]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.117',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00311633472813, 40.744034706747975]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00311633472813,\n",
" 40.744034706747975,\n",
" -74.00311633472813,\n",
" 40.744034706747975]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.118',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99991402945902, 40.72693288536128]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenwich Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Greenwich',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99991402945902,\n",
" 40.72693288536128,\n",
" -73.99991402945902,\n",
" 40.72693288536128]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.119',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98222616506416, 40.727846777270244]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98222616506416,\n",
" 40.727846777270244,\n",
" -73.98222616506416,\n",
" 40.727846777270244]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.120',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98089031999291, 40.71780674892765]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lower East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Lower',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98089031999291,\n",
" 40.71780674892765,\n",
" -73.98089031999291,\n",
" 40.71780674892765]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.121',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01068328559087, 40.721521967443216]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tribeca',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tribeca',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01068328559087,\n",
" 40.721521967443216,\n",
" -74.01068328559087,\n",
" 40.721521967443216]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.122',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99730467208073, 40.71932379395907]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Italy',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Italy',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99730467208073,\n",
" 40.71932379395907,\n",
" -73.99730467208073,\n",
" 40.71932379395907]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.123',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00065666959759, 40.72218384131794]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00065666959759,\n",
" 40.72218384131794,\n",
" -74.00065666959759,\n",
" 40.72218384131794]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.124',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00617998126812, 40.73443393572434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00617998126812,\n",
" 40.73443393572434,\n",
" -74.00617998126812,\n",
" 40.73443393572434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.125',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96428617740655, 40.797307041702865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96428617740655,\n",
" 40.797307041702865,\n",
" -73.96428617740655,\n",
" 40.797307041702865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.126',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96389627905332, 40.807999738165826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morningside Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morningside',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96389627905332,\n",
" 40.807999738165826,\n",
" -73.96389627905332,\n",
" 40.807999738165826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.127',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98137594833541, 40.737209832715]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gramercy',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gramercy',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98137594833541,\n",
" 40.737209832715,\n",
" -73.98137594833541,\n",
" 40.737209832715]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.128',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01686930508617, 40.71193198394565]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Battery Park City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Battery',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01686930508617,\n",
" 40.71193198394565,\n",
" -74.01686930508617,\n",
" 40.71193198394565]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.129',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0106654452127, 40.70710710727048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Financial District',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Financial',\n",
" 'annoline2': 'District',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.0106654452127,\n",
" 40.70710710727048,\n",
" -74.0106654452127,\n",
" 40.70710710727048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.130',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91565374304234, 40.76850859335492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91565374304234,\n",
" 40.76850859335492,\n",
" -73.91565374304234,\n",
" 40.76850859335492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.131',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90184166838284, 40.74634908860222]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90184166838284,\n",
" 40.74634908860222,\n",
" -73.90184166838284,\n",
" 40.74634908860222]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.132',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88282109164365, 40.75198138007367]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jackson Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jackson',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88282109164365,\n",
" 40.75198138007367,\n",
" -73.88282109164365,\n",
" 40.75198138007367]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.133',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88165622288388, 40.744048505122024]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elmhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Elmhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88165622288388,\n",
" 40.744048505122024,\n",
" -73.88165622288388,\n",
" 40.744048505122024]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.134',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8381376460028, 40.65422527738487]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howard Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howard',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8381376460028,\n",
" 40.65422527738487,\n",
" -73.8381376460028,\n",
" 40.65422527738487]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.135',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85682497345258, 40.74238175015667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Corona',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Corona',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85682497345258,\n",
" 40.74238175015667,\n",
" -73.85682497345258,\n",
" 40.74238175015667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.136',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84447500788983, 40.72526378216503]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84447500788983,\n",
" 40.72526378216503,\n",
" -73.84447500788983,\n",
" 40.72526378216503]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.137',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82981905825703, 40.7051790354148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82981905825703,\n",
" 40.7051790354148,\n",
" -73.82981905825703,\n",
" 40.7051790354148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.138',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83183321446887, 40.69794731471763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83183321446887,\n",
" 40.69794731471763,\n",
" -73.83183321446887,\n",
" 40.69794731471763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.139',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83177300329582, 40.76445419697846]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flushing',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flushing',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83177300329582,\n",
" 40.76445419697846,\n",
" -73.83177300329582,\n",
" 40.76445419697846]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.140',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93920223915505, 40.75021734610528]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Long Island City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Long',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93920223915505,\n",
" 40.75021734610528,\n",
" -73.93920223915505,\n",
" 40.75021734610528]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.141',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92691617561577, 40.74017628351924]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92691617561577,\n",
" 40.74017628351924,\n",
" -73.92691617561577,\n",
" 40.74017628351924]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.142',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86704147658772, 40.76407323883091]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Elmhurst',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Elmhurst',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.86704147658772,\n",
" 40.76407323883091,\n",
" -73.86704147658772,\n",
" 40.76407323883091]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.143',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89621713626859, 40.725427374093606]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Maspeth',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Maspeth',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89621713626859,\n",
" 40.725427374093606,\n",
" -73.89621713626859,\n",
" 40.725427374093606]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.144',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90143517559589, 40.70832315613858]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ridgewood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ridgewood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90143517559589,\n",
" 40.70832315613858,\n",
" -73.90143517559589,\n",
" 40.70832315613858]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.145',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87074167435605, 40.70276242967838]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glendale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Glendale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.87074167435605,\n",
" 40.70276242967838,\n",
" -73.87074167435605,\n",
" 40.70276242967838]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.146',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8578268690537, 40.72897409480735]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rego Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rego Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8578268690537,\n",
" 40.72897409480735,\n",
" -73.8578268690537,\n",
" 40.72897409480735]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.147',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8581104655432, 40.68988687915789]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodhaven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodhaven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8581104655432,\n",
" 40.68988687915789,\n",
" -73.8581104655432,\n",
" 40.68988687915789]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.148',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84320266173447, 40.680708468265415]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ozone Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ozone Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84320266173447,\n",
" 40.680708468265415,\n",
" -73.84320266173447,\n",
" 40.680708468265415]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.149',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80986478649041, 40.66854957767195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Ozone Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Ozone Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80986478649041,\n",
" 40.66854957767195,\n",
" -73.80986478649041,\n",
" 40.66854957767195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.150',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84304528896125, 40.784902749260205]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'College Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'College',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84304528896125,\n",
" 40.784902749260205,\n",
" -73.84304528896125,\n",
" 40.784902749260205]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.151',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81420216610863, 40.78129076602694]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Whitestone',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Whitestone',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81420216610863,\n",
" 40.78129076602694,\n",
" -73.81420216610863,\n",
" 40.78129076602694]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.152',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7742736306867, 40.76604063281064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7742736306867,\n",
" 40.76604063281064,\n",
" -73.7742736306867,\n",
" 40.76604063281064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.153',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79176243728061, 40.76172954903262]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Auburndale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Auburndale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79176243728061,\n",
" 40.76172954903262,\n",
" -73.79176243728061,\n",
" 40.76172954903262]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.154',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7388977558074, 40.7708261928267]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Neck',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Neck',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7388977558074,\n",
" 40.7708261928267,\n",
" -73.7388977558074,\n",
" 40.7708261928267]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.155',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7424982072733, 40.76684609790763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Douglaston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Douglaston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7424982072733,\n",
" 40.76684609790763,\n",
" -73.7424982072733,\n",
" 40.76684609790763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.156',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.71548118999145, 40.74944079974332]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glen Oaks',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Glen',\n",
" 'annoline2': 'Oaks',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.71548118999145,\n",
" 40.74944079974332,\n",
" -73.71548118999145,\n",
" 40.74944079974332]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.157',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.72012814826903, 40.72857318176675]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellerose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellerose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.72012814826903,\n",
" 40.72857318176675,\n",
" -73.72012814826903,\n",
" 40.72857318176675]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.158',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82087764933566, 40.722578244228046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens Hills',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': 'Hills',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82087764933566,\n",
" 40.722578244228046,\n",
" -73.82087764933566,\n",
" 40.722578244228046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.159',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78271337003264, 40.7343944653313]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fresh Meadows',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fresh',\n",
" 'annoline2': 'Meadows',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.78271337003264,\n",
" 40.7343944653313,\n",
" -73.78271337003264,\n",
" 40.7343944653313]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.160',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81174822458634, 40.71093547252271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Briarwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Briarwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81174822458634,\n",
" 40.71093547252271,\n",
" -73.81174822458634,\n",
" 40.71093547252271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.161',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79690165888289, 40.70465736068717]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79690165888289,\n",
" 40.70465736068717,\n",
" -73.79690165888289,\n",
" 40.70465736068717]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.162',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75494976234332, 40.74561857141855]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakland Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Oakland',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75494976234332,\n",
" 40.74561857141855,\n",
" -73.75494976234332,\n",
" 40.74561857141855]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.163',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73871484578424, 40.718893092167356]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queens Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queens',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73871484578424,\n",
" 40.718893092167356,\n",
" -73.73871484578424,\n",
" 40.718893092167356]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.164',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75925009335594, 40.71124344191904]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hollis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hollis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75925009335594,\n",
" 40.71124344191904,\n",
" -73.75925009335594,\n",
" 40.71124344191904]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.165',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7904261313554, 40.696911253789885]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Jamaica',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Jamaica',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7904261313554,\n",
" 40.696911253789885,\n",
" -73.7904261313554,\n",
" 40.696911253789885]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.166',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75867603727717, 40.69444538522359]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. Albans',\n",
" 'stacked': 1,\n",
" 'annoline1': 'St. Albans',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75867603727717,\n",
" 40.69444538522359,\n",
" -73.75867603727717,\n",
" 40.69444538522359]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.167',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77258787620906, 40.67521139591733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rochdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rochdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77258787620906,\n",
" 40.67521139591733,\n",
" -73.77258787620906,\n",
" 40.67521139591733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.168',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76042092682287, 40.666230490368584]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Springfield Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Springfield',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76042092682287,\n",
" 40.666230490368584,\n",
" -73.76042092682287,\n",
" 40.666230490368584]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.169',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526873708026, 40.692774639160845]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cambria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cambria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526873708026,\n",
" 40.692774639160845,\n",
" -73.73526873708026,\n",
" 40.692774639160845]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.170',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526079428278, 40.659816433428084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosedale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosedale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526079428278,\n",
" 40.659816433428084,\n",
" -73.73526079428278,\n",
" 40.659816433428084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.171',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75497968043872, 40.603134432500894]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Far Rockaway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Far Rockaway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75497968043872,\n",
" 40.603134432500894,\n",
" -73.75497968043872,\n",
" 40.603134432500894]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.172',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8200548911032, 40.60302658351238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broad Channel',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broad',\n",
" 'annoline2': 'Channel',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8200548911032,\n",
" 40.60302658351238,\n",
" -73.8200548911032,\n",
" 40.60302658351238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.173',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92551196994168, 40.55740128845452]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Breezy Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Breezy',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92551196994168,\n",
" 40.55740128845452,\n",
" -73.92551196994168,\n",
" 40.55740128845452]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.174',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90228960391673, 40.775923015642896]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Steinway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Steinway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90228960391673,\n",
" 40.775923015642896,\n",
" -73.90228960391673,\n",
" 40.775923015642896]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.175',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80436451720988, 40.79278140360048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Beechhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Beechhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80436451720988,\n",
" 40.79278140360048,\n",
" -73.80436451720988,\n",
" 40.79278140360048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.176',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7768022262158, 40.782842806245554]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7768022262158,\n",
" 40.782842806245554,\n",
" -73.7768022262158,\n",
" 40.782842806245554]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.177',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77613282391705, 40.595641807368494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgemere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edgemere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77613282391705,\n",
" 40.595641807368494,\n",
" -73.77613282391705,\n",
" 40.595641807368494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.178',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79199233136943, 40.58914394372971]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arverne',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arverne',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79199233136943,\n",
" 40.58914394372971,\n",
" -73.79199233136943,\n",
" 40.58914394372971]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.179',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82236121088751, 40.582801696845586]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Rockaway',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82236121088751,\n",
" 40.582801696845586,\n",
" -73.82236121088751,\n",
" 40.582801696845586]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.180',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85754672410827, 40.572036730217015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Neponsit',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Neponsit',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85754672410827,\n",
" 40.572036730217015,\n",
" -73.85754672410827,\n",
" 40.572036730217015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.181',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81276269135866, 40.764126122614066]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81276269135866,\n",
" 40.764126122614066,\n",
" -73.81276269135866,\n",
" 40.764126122614066]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.182',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.70884705889246, 40.741378421945434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Floral Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Floral Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.70884705889246,\n",
" 40.741378421945434,\n",
" -73.70884705889246,\n",
" 40.741378421945434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.183',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76714166714729, 40.7209572076444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Holliswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Holliswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76714166714729,\n",
" 40.7209572076444,\n",
" -73.76714166714729,\n",
" 40.7209572076444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.184',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7872269693666, 40.71680483014613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Estates',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Estates',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7872269693666,\n",
" 40.71680483014613,\n",
" -73.7872269693666,\n",
" 40.71680483014613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.185',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82580915110559, 40.7445723092867]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensboro Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queensboro',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82580915110559,\n",
" 40.7445723092867,\n",
" -73.82580915110559,\n",
" 40.7445723092867]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.186',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79760300912672, 40.723824901829204]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hillcrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hillcrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79760300912672,\n",
" 40.723824901829204,\n",
" -73.79760300912672,\n",
" 40.723824901829204]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.187',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93157506072878, 40.761704526054146]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ravenswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ravenswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93157506072878,\n",
" 40.761704526054146,\n",
" -73.93157506072878,\n",
" 40.761704526054146]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.188',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84963782402441, 40.66391841925139]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lindenwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Lindenwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84963782402441,\n",
" 40.66391841925139,\n",
" -73.84963782402441,\n",
" 40.66391841925139]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.189',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.74025607989822, 40.66788389660247]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Laurelton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Laurelton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.74025607989822,\n",
" 40.66788389660247,\n",
" -73.74025607989822,\n",
" 40.66788389660247]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.190',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8625247141374, 40.736074570830795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lefrak City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lefrak',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8625247141374,\n",
" 40.736074570830795,\n",
" -73.8625247141374,\n",
" 40.736074570830795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.191',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8540175039252, 40.57615556543109]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belle Harbor',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belle Harbor',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8540175039252,\n",
" 40.57615556543109,\n",
" -73.8540175039252,\n",
" 40.57615556543109]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.192',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84153370226186, 40.58034295646131]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rockaway Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84153370226186,\n",
" 40.58034295646131,\n",
" -73.84153370226186,\n",
" 40.58034295646131]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.193',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79664750844047, 40.59771061565768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Somerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Somerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79664750844047,\n",
" 40.59771061565768,\n",
" -73.79664750844047,\n",
" 40.59771061565768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.194',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75175310731153, 40.66000322733613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brookville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brookville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75175310731153,\n",
" 40.66000322733613,\n",
" -73.75175310731153,\n",
" 40.66000322733613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.195',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73889198912481, 40.73301404027834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellaire',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellaire',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73889198912481,\n",
" 40.73301404027834,\n",
" -73.73889198912481,\n",
" 40.73301404027834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.196',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85751790676447, 40.7540709990489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Corona',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Corona',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85751790676447,\n",
" 40.7540709990489,\n",
" -73.85751790676447,\n",
" 40.7540709990489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.197',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8410221123401, 40.7146110815117]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8410221123401,\n",
" 40.7146110815117,\n",
" -73.8410221123401,\n",
" 40.7146110815117]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.198',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07935312512797, 40.6449815710044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. George',\n",
" 'stacked': 2,\n",
" 'annoline1': 'St.',\n",
" 'annoline2': 'George',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07935312512797,\n",
" 40.6449815710044,\n",
" -74.07935312512797,\n",
" 40.6449815710044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.199',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08701650516625, 40.64061455913511]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08701650516625,\n",
" 40.64061455913511,\n",
" -74.08701650516625,\n",
" 40.64061455913511]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.200',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07790192660066, 40.62692762538176]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stapleton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Stapleton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07790192660066,\n",
" 40.62692762538176,\n",
" -74.07790192660066,\n",
" 40.62692762538176]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.201',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06980526716141, 40.61530494652761]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosebank',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosebank',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06980526716141,\n",
" 40.61530494652761,\n",
" -74.06980526716141,\n",
" 40.61530494652761]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.202',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1071817826561, 40.63187892654607]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1071817826561,\n",
" 40.63187892654607,\n",
" -74.1071817826561,\n",
" 40.63187892654607]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.203',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08724819983729, 40.624184791313006]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grymes Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grymes',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08724819983729,\n",
" 40.624184791313006,\n",
" -74.08724819983729,\n",
" 40.624184791313006]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.204',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1113288180088, 40.59706851814673]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Todt Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Todt',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1113288180088,\n",
" 40.59706851814673,\n",
" -74.1113288180088,\n",
" 40.59706851814673]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.205',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0795529253982, 40.58024741350956]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0795529253982,\n",
" 40.58024741350956,\n",
" -74.0795529253982,\n",
" 40.58024741350956]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.206',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12943426797008, 40.63366930554365]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Richmond',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Richmond',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12943426797008,\n",
" 40.63366930554365,\n",
" -74.12943426797008,\n",
" 40.63366930554365]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.207',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15008537046981, 40.632546390481124]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Mariner's Harbor\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Mariner's\",\n",
" 'annoline2': 'Harbor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15008537046981,\n",
" 40.632546390481124,\n",
" -74.15008537046981,\n",
" 40.632546390481124]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.208',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17464532993542, 40.63968297845542]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Ivory',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Ivory',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17464532993542,\n",
" 40.63968297845542,\n",
" -74.17464532993542,\n",
" 40.63968297845542]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.209',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.11918058534842, 40.61333593766742]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castleton Corners',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castleton',\n",
" 'annoline2': 'Corners',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.11918058534842,\n",
" 40.61333593766742,\n",
" -74.11918058534842,\n",
" 40.61333593766742]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.210',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16496031329827, 40.594252379161695]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Springville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Springville',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16496031329827,\n",
" 40.594252379161695,\n",
" -74.16496031329827,\n",
" 40.594252379161695]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.211',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19073717538116, 40.58631375103281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Travis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Travis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19073717538116,\n",
" 40.58631375103281,\n",
" -74.19073717538116,\n",
" 40.58631375103281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.212',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1164794360638, 40.57257231820632]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1164794360638,\n",
" 40.57257231820632,\n",
" -74.1164794360638,\n",
" 40.57257231820632]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.213',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12156593771896, 40.5584622432888]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Oakwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12156593771896,\n",
" 40.5584622432888,\n",
" -74.12156593771896,\n",
" 40.5584622432888]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.214',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.14932381490992, 40.549480228713605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Great Kills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Great',\n",
" 'annoline2': 'Kills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.14932381490992,\n",
" 40.549480228713605,\n",
" -74.14932381490992,\n",
" 40.549480228713605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.215',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1643308041936, 40.542230747450745]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eltingville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eltingville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1643308041936,\n",
" 40.542230747450745,\n",
" -74.1643308041936,\n",
" 40.542230747450745]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.216',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17854866165878, 40.53811417474507]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Annadale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Annadale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17854866165878,\n",
" 40.53811417474507,\n",
" -74.17854866165878,\n",
" 40.53811417474507]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.217',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20524582480326, 40.541967622888755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodrow',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodrow',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20524582480326,\n",
" 40.541967622888755,\n",
" -74.20524582480326,\n",
" 40.541967622888755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.218',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.24656934235283, 40.50533376115642]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tottenville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tottenville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.24656934235283,\n",
" 40.50533376115642,\n",
" -74.24656934235283,\n",
" 40.50533376115642]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.219',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08055351790115, 40.637316067110326]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tompkinsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tompkinsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08055351790115,\n",
" 40.637316067110326,\n",
" -74.08055351790115,\n",
" 40.637316067110326]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.220',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09629029235458, 40.61919310792676]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Silver Lake',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Silver',\n",
" 'annoline2': 'Lake',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09629029235458,\n",
" 40.61919310792676,\n",
" -74.09629029235458,\n",
" 40.61919310792676]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.221',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0971255217853, 40.61276015756489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0971255217853,\n",
" 40.61276015756489,\n",
" -74.0971255217853,\n",
" 40.61276015756489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.222',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96101312466779, 40.643675183340974]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ditmas Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ditmas',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96101312466779,\n",
" 40.643675183340974,\n",
" -73.96101312466779,\n",
" 40.643675183340974]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.223',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93718680559314, 40.66094656188111]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wingate',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wingate',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93718680559314,\n",
" 40.66094656188111,\n",
" -73.93718680559314,\n",
" 40.66094656188111]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.224',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92688212616955, 40.655572313280764]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rugby',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rugby',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92688212616955,\n",
" 40.655572313280764,\n",
" -73.92688212616955,\n",
" 40.655572313280764]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.225',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08015734936296, 40.60919044434558]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08015734936296,\n",
" 40.60919044434558,\n",
" -74.08015734936296,\n",
" 40.60919044434558]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.226',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13304143951704, 40.62109047275409]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westerleigh',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Westerleigh',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13304143951704,\n",
" 40.62109047275409,\n",
" -74.13304143951704,\n",
" 40.62109047275409]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.227',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15315246387762, 40.620171512231884]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Graniteville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Graniteville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15315246387762,\n",
" 40.620171512231884,\n",
" -74.15315246387762,\n",
" 40.620171512231884]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.228',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16510420241124, 40.63532509911492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arlington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arlington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16510420241124,\n",
" 40.63532509911492,\n",
" -74.16510420241124,\n",
" 40.63532509911492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.229',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06712363225574, 40.596312571276734]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arrochar',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arrochar',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06712363225574,\n",
" 40.596312571276734,\n",
" -74.06712363225574,\n",
" 40.596312571276734]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.230',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0766743627905, 40.59826835959991]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grasmere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Grasmere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0766743627905,\n",
" 40.59826835959991,\n",
" -74.0766743627905,\n",
" 40.59826835959991]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.231',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08751118005578, 40.59632891379513]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Old Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Old',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08751118005578,\n",
" 40.59632891379513,\n",
" -74.08751118005578,\n",
" 40.59632891379513]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.232',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09639905312521, 40.588672948199275]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dongan Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dongan',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09639905312521,\n",
" 40.588672948199275,\n",
" -74.09639905312521,\n",
" 40.588672948199275]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.233',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09348266303591, 40.57352690574283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midland Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midland',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09348266303591,\n",
" 40.57352690574283,\n",
" -74.09348266303591,\n",
" 40.57352690574283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.234',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10585598545434, 40.57621558711788]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grant City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grant',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10585598545434,\n",
" 40.57621558711788,\n",
" -74.10585598545434,\n",
" 40.57621558711788]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.235',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10432707469124, 40.56425549307335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp Beach',\n",
" 'stacked': 3,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': 'Beach',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10432707469124,\n",
" 40.56425549307335,\n",
" -74.10432707469124,\n",
" 40.56425549307335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.236',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13916622175768, 40.55398800858462]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13916622175768,\n",
" 40.55398800858462,\n",
" -74.13916622175768,\n",
" 40.55398800858462]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.237',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19174105747814, 40.531911920489605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Huguenot',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Huguenot',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19174105747814,\n",
" 40.531911920489605,\n",
" -74.19174105747814,\n",
" 40.531911920489605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.238',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21983106616777, 40.524699376118136]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pleasant Plains',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pleasant',\n",
" 'annoline2': 'Plains',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21983106616777,\n",
" 40.524699376118136,\n",
" -74.21983106616777,\n",
" 40.524699376118136]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.239',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22950350260027, 40.50608165346305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Butler Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Butler',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22950350260027,\n",
" 40.50608165346305,\n",
" -74.22950350260027,\n",
" 40.50608165346305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.240',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.23215775896526, 40.53053148283314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Charleston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Charleston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.23215775896526,\n",
" 40.53053148283314,\n",
" -74.23215775896526,\n",
" 40.53053148283314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.241',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21572851113952, 40.54940400650072]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rossville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rossville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21572851113952,\n",
" 40.54940400650072,\n",
" -74.21572851113952,\n",
" 40.54940400650072]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.242',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18588674583893, 40.54928582278321]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arden Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Arden',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18588674583893,\n",
" 40.54928582278321,\n",
" -74.18588674583893,\n",
" 40.54928582278321]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.243',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17079414786092, 40.555295236173194]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17079414786092,\n",
" 40.555295236173194,\n",
" -74.17079414786092,\n",
" 40.555295236173194]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.244',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15902208156601, 40.58913894875281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Heartland Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Heartland',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15902208156601,\n",
" 40.58913894875281,\n",
" -74.15902208156601,\n",
" 40.58913894875281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.245',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1895604551969, 40.59472602746295]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1895604551969,\n",
" 40.59472602746295,\n",
" -74.1895604551969,\n",
" 40.59472602746295]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.246',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18725638381567, 40.60577868452358]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bloomfield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bloomfield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18725638381567,\n",
" 40.60577868452358,\n",
" -74.18725638381567,\n",
" 40.60577868452358]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.247',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15940948657122, 40.6095918004203]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bulls Head',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bulls',\n",
" 'annoline2': 'Head',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15940948657122,\n",
" 40.6095918004203,\n",
" -74.15940948657122,\n",
" 40.6095918004203]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.248',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95325646837112, 40.7826825671257]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carnegie Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carnegie',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.95325646837112,\n",
" 40.7826825671257,\n",
" -73.95325646837112,\n",
" 40.7826825671257]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.249',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98843368023597, 40.72325901885768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Noho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Noho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98843368023597,\n",
" 40.72325901885768,\n",
" -73.98843368023597,\n",
" 40.72325901885768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.250',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00541529873355, 40.71522892046282]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Civic Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Civic',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00541529873355,\n",
" 40.71522892046282,\n",
" -74.00541529873355,\n",
" 40.71522892046282]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.251',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98871313285247, 40.7485096643122]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': 'South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98871313285247,\n",
" 40.7485096643122,\n",
" -73.98871313285247,\n",
" 40.7485096643122]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.252',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1340572986257, 40.56960594275505]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1340572986257,\n",
" 40.56960594275505,\n",
" -74.1340572986257,\n",
" 40.56960594275505]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.253',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06667766061771, 40.60971934079284]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Shore Acres',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Shore',\n",
" 'annoline2': 'Acres',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06667766061771,\n",
" 40.60971934079284,\n",
" -74.06667766061771,\n",
" 40.60971934079284]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.254',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.072642445484, 40.61917845202843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clifton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clifton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.072642445484,\n",
" 40.61917845202843,\n",
" -74.072642445484,\n",
" 40.61917845202843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.255',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08402364740358, 40.6044731896879]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concord',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concord',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08402364740358,\n",
" 40.6044731896879,\n",
" -74.08402364740358,\n",
" 40.6044731896879]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.256',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09776206972522, 40.606794394801]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Emerson Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Emerson',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09776206972522,\n",
" 40.606794394801,\n",
" -74.09776206972522,\n",
" 40.606794394801]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.257',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09805062373887, 40.63563000681151]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Randall Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Randall',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09805062373887,\n",
" 40.63563000681151,\n",
" -74.09805062373887,\n",
" 40.63563000681151]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.258',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18622331749823, 40.63843283794795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howland Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howland',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18622331749823,\n",
" 40.63843283794795,\n",
" -74.18622331749823,\n",
" 40.63843283794795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.259',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1418167896889, 40.630146741193826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elm Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Elm',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1418167896889,\n",
" 40.630146741193826,\n",
" -74.1418167896889,\n",
" 40.630146741193826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.260',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91665331978048, 40.652117451793494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Remsen Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Remsen',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91665331978048,\n",
" 40.652117451793494,\n",
" -73.91665331978048,\n",
" 40.652117451793494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.261',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88511776379292, 40.6627442796966]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Lots',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Lots',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88511776379292,\n",
" 40.6627442796966,\n",
" -73.88511776379292,\n",
" 40.6627442796966]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.262',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90233474295836, 40.63131755039667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Paerdegat Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Paerdegat',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90233474295836,\n",
" 40.63131755039667,\n",
" -73.90233474295836,\n",
" 40.63131755039667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.263',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91515391550404, 40.61597423962336]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91515391550404,\n",
" 40.61597423962336,\n",
" -73.91515391550404,\n",
" 40.61597423962336]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.264',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79646462081593, 40.71145964370482]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79646462081593,\n",
" 40.71145964370482,\n",
" -73.79646462081593,\n",
" 40.71145964370482]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.265',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79671678028349, 40.73350025429757]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Utopia',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Utopia',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79671678028349,\n",
" 40.73350025429757,\n",
" -73.79671678028349,\n",
" 40.73350025429757]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.266',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80486120040537, 40.73493618075478]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pomonok',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pomonok',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80486120040537,\n",
" 40.73493618075478,\n",
" -73.80486120040537,\n",
" 40.73493618075478]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.267',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89467996270574, 40.7703173929982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89467996270574,\n",
" 40.7703173929982,\n",
" -73.89467996270574,\n",
" 40.7703173929982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.268',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90119903387667, 40.83142834161548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Claremont Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Claremont',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90119903387667,\n",
" 40.83142834161548,\n",
" -73.90119903387667,\n",
" 40.83142834161548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.269',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91584652759009, 40.824780490842905]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91584652759009,\n",
" 40.824780490842905,\n",
" -73.91584652759009,\n",
" 40.824780490842905]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.270',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91655551964419, 40.84382617671654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Eden',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Eden',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91655551964419,\n",
" 40.84382617671654,\n",
" -73.91655551964419,\n",
" 40.84382617671654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.271',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90829930881988, 40.84884160724665]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Hope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Hope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90829930881988,\n",
" 40.84884160724665,\n",
" -73.90829930881988,\n",
" 40.84884160724665]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.272',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96355614094303, 40.76028033131374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sutton Place',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sutton',\n",
" 'annoline2': 'Place',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96355614094303,\n",
" 40.76028033131374,\n",
" -73.96355614094303,\n",
" 40.76028033131374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.273',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95386782130745, 40.743414090073536]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunters Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunters',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.95386782130745,\n",
" 40.743414090073536,\n",
" -73.95386782130745,\n",
" 40.743414090073536]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.274',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96770824581834, 40.75204236950722]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Turtle Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Turtle',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96770824581834,\n",
" 40.75204236950722,\n",
" -73.96770824581834,\n",
" 40.75204236950722]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.275',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97121928722265, 40.746917410740195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tudor City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Tudor',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97121928722265,\n",
" 40.746917410740195,\n",
" -73.97121928722265,\n",
" 40.746917410740195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.276',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97405170469203, 40.73099955477061]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stuyvesant Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Stuyvesant',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97405170469203,\n",
" 40.73099955477061,\n",
" -73.97405170469203,\n",
" 40.73099955477061]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.277',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9909471052826, 40.739673047638426]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatiron',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatiron',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9909471052826,\n",
" 40.739673047638426,\n",
" -73.9909471052826,\n",
" 40.739673047638426]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.278',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91819286431682, 40.74565180608076]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91819286431682,\n",
" 40.74565180608076,\n",
" -73.91819286431682,\n",
" 40.74565180608076]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.279',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93244235260178, 40.73725071694497]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Blissville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Blissville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93244235260178,\n",
" 40.73725071694497,\n",
" -73.93244235260178,\n",
" 40.73725071694497]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.280',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99550751888415, 40.70328109093014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fulton Ferry',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fulton',\n",
" 'annoline2': 'Ferry',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99550751888415,\n",
" 40.70328109093014,\n",
" -73.99550751888415,\n",
" 40.70328109093014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.281',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98111603592393, 40.70332149882874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Vinegar Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Vinegar',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98111603592393,\n",
" 40.70332149882874,\n",
" -73.98111603592393,\n",
" 40.70332149882874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.282',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93053108817338, 40.67503986503237]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Weeksville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Weeksville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93053108817338,\n",
" 40.67503986503237,\n",
" -73.93053108817338,\n",
" 40.67503986503237]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.283',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90331684852599, 40.67786104769531]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broadway Junction',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broadway',\n",
" 'annoline2': 'Junction',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90331684852599,\n",
" 40.67786104769531,\n",
" -73.90331684852599,\n",
" 40.67786104769531]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.284',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9887528074504, 40.70317632822692]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dumbo',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Dumbo',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9887528074504,\n",
" 40.70317632822692,\n",
" -73.9887528074504,\n",
" 40.70317632822692]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.285',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12059399718001, 40.60180957631444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manor Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manor',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12059399718001,\n",
" 40.60180957631444,\n",
" -74.12059399718001,\n",
" 40.60180957631444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.286',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13208447484298, 40.60370692627371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Willowbrook',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Willowbrook',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13208447484298,\n",
" 40.60370692627371,\n",
" -74.13208447484298,\n",
" 40.60370692627371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.287',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21776636068567, 40.541139922091766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sandy Ground',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sandy',\n",
" 'annoline2': 'Ground',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21776636068567,\n",
" 40.541139922091766,\n",
" -74.21776636068567,\n",
" 40.541139922091766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.288',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12727240604946, 40.579118742961214]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Egbertville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Egbertville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12727240604946,\n",
" 40.579118742961214,\n",
" -74.12727240604946,\n",
" 40.579118742961214]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.289',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89213760232822, 40.56737588957032]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roxbury',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roxbury',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89213760232822,\n",
" 40.56737588957032,\n",
" -73.89213760232822,\n",
" 40.56737588957032]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.290',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95918459428702, 40.598525095137255]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Homecrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Homecrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95918459428702,\n",
" 40.598525095137255,\n",
" -73.95918459428702,\n",
" 40.598525095137255]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.291',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88114319200604, 40.716414511158185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Middle Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Middle',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88114319200604,\n",
" 40.716414511158185,\n",
" -73.88114319200604,\n",
" 40.716414511158185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.292',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20152556457658, 40.52626406734812]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Prince's Bay\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Prince's\",\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20152556457658,\n",
" 40.52626406734812,\n",
" -74.20152556457658,\n",
" 40.52626406734812]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.293',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13792663771568, 40.57650629379489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lighthouse Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lighthouse',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13792663771568,\n",
" 40.57650629379489,\n",
" -74.13792663771568,\n",
" 40.57650629379489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.294',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22957080626941, 40.51954145748909]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22957080626941,\n",
" 40.51954145748909,\n",
" -74.22957080626941,\n",
" 40.51954145748909]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.295',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82667757138641, 40.79060155670148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Malba',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Malba',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82667757138641,\n",
" 40.79060155670148,\n",
" -73.82667757138641,\n",
" 40.79060155670148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.296',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.890345709872, 40.6819989345173]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Highland Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Highland',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.890345709872,\n",
" 40.6819989345173,\n",
" -73.890345709872,\n",
" 40.6819989345173]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.297',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94841515328893, 40.60937770113766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Madison',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Madison',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94841515328893,\n",
" 40.60937770113766,\n",
" -73.94841515328893,\n",
" 40.60937770113766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.298',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86172577555115, 40.85272297633017]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bronxdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bronxdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86172577555115,\n",
" 40.85272297633017,\n",
" -73.86172577555115,\n",
" 40.85272297633017]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.299',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85931863221647, 40.86578787802982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Allerton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Allerton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85931863221647,\n",
" 40.86578787802982,\n",
" -73.85931863221647,\n",
" 40.86578787802982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.300',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90152264513144, 40.8703923914147]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90152264513144,\n",
" 40.8703923914147,\n",
" -73.90152264513144,\n",
" 40.8703923914147]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.301',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94817709920184, 40.64692606658579]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Erasmus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Erasmus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94817709920184,\n",
" 40.64692606658579,\n",
" -73.94817709920184,\n",
" 40.64692606658579]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.302',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00011136202637, 40.75665808227519]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hudson Yards',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hudson',\n",
" 'annoline2': 'Yards',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00011136202637,\n",
" 40.75665808227519,\n",
" -74.00011136202637,\n",
" 40.75665808227519]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.303',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80553002968718, 40.58733774018741]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hammels',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hammels',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80553002968718,\n",
" 40.58733774018741,\n",
" -73.80553002968718,\n",
" 40.58733774018741]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.304',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76596781445627, 40.611321691283834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayswater',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayswater',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76596781445627,\n",
" 40.611321691283834,\n",
" -73.76596781445627,\n",
" 40.611321691283834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.305',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94563070334091, 40.756091297094706]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Queensbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.94563070334091,\n",
" 40.756091297094706,\n",
" -73.94563070334091,\n",
" 40.756091297094706]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.306',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08173992211962, 40.61731079252983]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fox Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fox',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08173992211962,\n",
" 40.61731079252983,\n",
" -74.08173992211962,\n",
" 40.61731079252983]}}],\n",
" 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG::4326'}},\n",
" 'bbox': [-74.2492599487305,\n",
" 40.5033187866211,\n",
" -73.7061614990234,\n",
" 40.9105606079102]}"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newyork_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how all the relevant data is in the _features_ key, which is basically a list of the neighborhoods. So, let's define a new variable that includes this data.\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"neighborhoods_data = newyork_data['features']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the first item in this list.\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}}"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods_data[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Tranform the data into a _pandas_ dataframe\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next task is essentially transforming this data of nested Python dictionaries into a _pandas_ dataframe. So let's start by creating an empty dataframe.\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# define the dataframe columns\n",
"column_names = ['Borough', 'Neighborhood', 'Latitude', 'Longitude'] \n",
"\n",
"# instantiate the dataframe\n",
"neighborhoods = pd.DataFrame(columns=column_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Take a look at the empty dataframe to confirm that the columns are as intended.\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [Borough, Neighborhood, Latitude, Longitude]\n",
"Index: []"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then let's loop through the data and fill the dataframe one row at a time.\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"for data in neighborhoods_data:\n",
" borough = neighborhood_name = data['properties']['borough'] \n",
" neighborhood_name = data['properties']['name']\n",
" \n",
" neighborhood_latlon = data['geometry']['coordinates']\n",
" neighborhood_lat = neighborhood_latlon[1]\n",
" neighborhood_lon = neighborhood_latlon[0]\n",
" \n",
" neighborhoods = neighborhoods.append({'Borough': borough,\n",
" 'Neighborhood': neighborhood_name,\n",
" 'Latitude': neighborhood_lat,\n",
" 'Longitude': neighborhood_lon}, ignore_index=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Quickly examine the resulting dataframe.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Bronx</td>\n",
" <td>Wakefield</td>\n",
" <td>40.894705</td>\n",
" <td>-73.847201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bronx</td>\n",
" <td>Co-op City</td>\n",
" <td>40.874294</td>\n",
" <td>-73.829939</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Bronx</td>\n",
" <td>Eastchester</td>\n",
" <td>40.887556</td>\n",
" <td>-73.827806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Bronx</td>\n",
" <td>Fieldston</td>\n",
" <td>40.895437</td>\n",
" <td>-73.905643</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Bronx</td>\n",
" <td>Riverdale</td>\n",
" <td>40.890834</td>\n",
" <td>-73.912585</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Bronx Wakefield 40.894705 -73.847201\n",
"1 Bronx Co-op City 40.874294 -73.829939\n",
"2 Bronx Eastchester 40.887556 -73.827806\n",
"3 Bronx Fieldston 40.895437 -73.905643\n",
"4 Bronx Riverdale 40.890834 -73.912585"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And make sure that the dataset has all 5 boroughs and 306 neighborhoods.\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The dataframe has 5 boroughs and 306 neighborhoods.\n"
]
}
],
"source": [
"print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n",
" len(neighborhoods['Borough'].unique()),\n",
" neighborhoods.shape[0]\n",
" )\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Use geopy library to get the latitude and longitude values of New York City.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>ny_explorer</em>, as shown below.\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of New York City are 40.7127281, -74.0060152.\n"
]
}
],
"source": [
"address = 'New York City, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of New York City are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a map of New York with neighborhoods superimposed on top.\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3YyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3YycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfN2ZlYTFiZTViMGFmNGRmMmJlMjQwNTAwYjZmOTZkNWUgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyOTFhN2JlODIyYTQzNGM5NTI2NGNjNDA5NmEwODAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NzI4OGJjMjZjYzQ4NTNiMGVlMzFjM2MzYzY1MGYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlZmI4YzFlZTNkYjRlMjA5NzhmNDY0ZjU4ZDQ2MmFhID0gJCgnPGRpdiBpZD0iaHRtbF8wZWZiOGMxZWUzZGI0ZTIwOTc4ZjQ2NGY1OGQ0NjJhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY3Mjg4YmMyNmNjNDg1M2IwZWUzMWMzYzNjNjUwZjIuc2V0Q29udGVudChodG1sXzBlZmI4YzFlZTNkYjRlMjA5NzhmNDY0ZjU4ZDQ2MmFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgyOTFhN2JlODIyYTQzNGM5NTI2NGNjNDA5NmEwODAyLmJpbmRQb3B1cChwb3B1cF8xNjcyODhiYzI2Y2M0ODUzYjBlZTMxYzNjM2M2NTBmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDg0NDAwY2MyNGM0N2Q2OWI4MGE1YjFiMTk1NzU0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NzE0ZWM2MjE2NmY0NzBkYWMwMDNlOThlMWZhODM0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84M2IyZDcxZmEyY2I0YzVlYjQzMjJiYjRkNGExYWEwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfODNiMmQ3MWZhMmNiNGM1ZWI0MzIyYmI0ZDRhMWFhMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzE0ZWM2MjE2NmY0NzBkYWMwMDNlOThlMWZhODM0Yi5zZXRDb250ZW50KGh0bWxfODNiMmQ3MWZhMmNiNGM1ZWI0MzIyYmI0ZDRhMWFhMDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTQ4NDQwMGNjMjRjNDdkNjliODBhNWIxYjE5NTc1NDUuYmluZFBvcHVwKHBvcHVwXzY3MTRlYzYyMTY2ZjQ3MGRhYzAwM2U5OGUxZmE4MzRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2ZmM3N2UyM2U2MDQyYzhhYWY1OGUxZTRiOTEyZmYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OWI0NDdhNmE0ZGQ0M2MyOTNjMWFlODQ2MDBjODY2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTkzMjY1ZTE3YmM0MTFlOTQyMjgzMzg5MWU4NmY0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmE5MzI2NWUxN2JjNDExZTk0MjI4MzM4OTFlODZmNDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDliNDQ3YTZhNGRkNDNjMjkzYzFhZTg0NjAwYzg2NjUuc2V0Q29udGVudChodG1sXzJhOTMyNjVlMTdiYzQxMWU5NDIyODMzODkxZTg2ZjQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E2ZmM3N2UyM2U2MDQyYzhhYWY1OGUxZTRiOTEyZmYzLmJpbmRQb3B1cChwb3B1cF80OWI0NDdhNmE0ZGQ0M2MyOTNjMWFlODQ2MDBjODY2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZDlhMjdhYTE2ZTQ0ZjZkOWI0YzQwYjk2NmE1OTVkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZWMxMTlhNjNhMmQ0YjBjYWQzODIzMTYwNDY3YWRlOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hN2NiODUwMmE3NGQ0YWRjYTRhMTZhNTI3ZWIxYjk5YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTdjYjg1MDJhNzRkNGFkY2E0YTE2YTUyN2ViMWI5OWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVlYzExOWE2M2EyZDRiMGNhZDM4MjMxNjA0NjdhZGU5LnNldENvbnRlbnQoaHRtbF9hN2NiODUwMmE3NGQ0YWRjYTRhMTZhNTI3ZWIxYjk5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZDlhMjdhYTE2ZTQ0ZjZkOWI0YzQwYjk2NmE1OTVkMS5iaW5kUG9wdXAocG9wdXBfNWVjMTE5YTYzYTJkNGIwY2FkMzgyMzE2MDQ2N2FkZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmE1N2YyNmY2Y2Y2NDJjYjkyMmE4NDJhYmY2OWVjOTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzc4NzdiMjc2MWRmNGY0M2I4NjY5OTdiMzcwZTRmNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjE3Y2Q5MTFlNTY2NDIxOGIxMDQ3YjEwOTEwNTkxNTYgPSAkKCc8ZGl2IGlkPSJodG1sXzIxN2NkOTExZTU2NjQyMThiMTA0N2IxMDkxMDU5MTU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Nzg3N2IyNzYxZGY0ZjQzYjg2Njk5N2IzNzBlNGY2ZC5zZXRDb250ZW50KGh0bWxfMjE3Y2Q5MTFlNTY2NDIxOGIxMDQ3YjEwOTEwNTkxNTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmE1N2YyNmY2Y2Y2NDJjYjkyMmE4NDJhYmY2OWVjOTguYmluZFBvcHVwKHBvcHVwXzc3ODc3YjI3NjFkZjRmNDNiODY2OTk3YjM3MGU0ZjZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3N2Q1YzFmMzI3MTRiZGY4ZjA2MzVlNmJkZGRjN2VkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyMjA4YzBiZDNlNzQ0NzZiOWUzNDc4YzIzMjdmMDhiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NjlmMTZhN2JjZTQ0MDY4MTEyNjFlZTVmNDI3YWEwID0gJCgnPGRpdiBpZD0iaHRtbF80NjY5ZjE2YTdiY2U0NDA2ODExMjYxZWU1ZjQyN2FhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjIwOGMwYmQzZTc0NDc2YjllMzQ3OGMyMzI3ZjA4Yi5zZXRDb250ZW50KGh0bWxfNDY2OWYxNmE3YmNlNDQwNjgxMTI2MWVlNWY0MjdhYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTc3ZDVjMWYzMjcxNGJkZjhmMDYzNWU2YmRkZGM3ZWQuYmluZFBvcHVwKHBvcHVwXzQyMjA4YzBiZDNlNzQ0NzZiOWUzNDc4YzIzMjdmMDhiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkZDYyNDk1MjMyYjRiMTg5N2I2ZDZkYWVjOWI4YTczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhNTgxNWVmODg3ZDRhMGVhNTUxNDMwZTc5YTUxMzQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlMTU3OWE1ZjU5ZjRlMGRhYWQ4OGMzMzJjOWIyMWYyID0gJCgnPGRpdiBpZD0iaHRtbF84ZTE1NzlhNWY1OWY0ZTBkYWFkODhjMzMyYzliMjFmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGE1ODE1ZWY4ODdkNGEwZWE1NTE0MzBlNzlhNTEzNDEuc2V0Q29udGVudChodG1sXzhlMTU3OWE1ZjU5ZjRlMGRhYWQ4OGMzMzJjOWIyMWYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkZDYyNDk1MjMyYjRiMTg5N2I2ZDZkYWVjOWI4YTczLmJpbmRQb3B1cChwb3B1cF9kYTU4MTVlZjg4N2Q0YTBlYTU1MTQzMGU3OWE1MTM0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMTliYTZjMzZjYTk0Y2IxODEzMWMzM2UzMzRkNzVjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMzZmNmFmMTZiNTc0ZTkzYWJkZTA5YjFjZGZlNDE2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNjlmYzFmOTJjM2Q0Nzk0YTRiYTllODhiNzIxODE5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDY5ZmMxZjkyYzNkNDc5NGE0YmE5ZTg4YjcyMTgxOTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM2ZjZhZjE2YjU3NGU5M2FiZGUwOWIxY2RmZTQxNjUuc2V0Q29udGVudChodG1sXzA2OWZjMWY5MmMzZDQ3OTRhNGJhOWU4OGI3MjE4MTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExOWJhNmMzNmNhOTRjYjE4MTMxYzMzZTMzNGQ3NWMxLmJpbmRQb3B1cChwb3B1cF8wMzZmNmFmMTZiNTc0ZTkzYWJkZTA5YjFjZGZlNDE2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTYyZmU0YzRhMWQ0MDA2YjhkYmFiNTQ3OTJiNTQ0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4MTMxYzFkMjljMTQ5ZTA5YzlmOWI4NjMxN2NlYTE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjMDk1YzE2NzNhODQzYmY5MDAzMjBkZjZmMjIxYzY1ID0gJCgnPGRpdiBpZD0iaHRtbF9hYzA5NWMxNjczYTg0M2JmOTAwMzIwZGY2ZjIyMWM2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4MTMxYzFkMjljMTQ5ZTA5YzlmOWI4NjMxN2NlYTE5LnNldENvbnRlbnQoaHRtbF9hYzA5NWMxNjczYTg0M2JmOTAwMzIwZGY2ZjIyMWM2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOTYyZmU0YzRhMWQ0MDA2YjhkYmFiNTQ3OTJiNTQ0ZC5iaW5kUG9wdXAocG9wdXBfZjgxMzFjMWQyOWMxNDllMDljOWY5Yjg2MzE3Y2VhMTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWY5YzhmMGNmMGYyNGE2ZmI0MTc2ZWU1NDk1N2JhNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRmMGQzZTM1MDYxNGQyZjgzYWY4NmVlYjRkNWVkNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNlZmI2NjMwMGI4NGI4OGFhMjI1MmZjMjg2ODQ3MWMgPSAkKCc8ZGl2IGlkPSJodG1sX2VjZWZiNjYzMDBiODRiODhhYTIyNTJmYzI4Njg0NzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0ZjBkM2UzNTA2MTRkMmY4M2FmODZlZWI0ZDVlZDU4LnNldENvbnRlbnQoaHRtbF9lY2VmYjY2MzAwYjg0Yjg4YWEyMjUyZmMyODY4NDcxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZjljOGYwY2YwZjI0YTZmYjQxNzZlZTU0OTU3YmE2ZC5iaW5kUG9wdXAocG9wdXBfNDRmMGQzZTM1MDYxNGQyZjgzYWY4NmVlYjRkNWVkNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM2NmQ1MDUzODZkNDZhNGE3MWRiM2E0MTlhZDlkNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0MzlkNWI4OGE3ODRlZTZhYmE3NjYzZjlhYTE3ZDA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyNjJmMDNlNWQ0ODQ1Njc5ZDliYmQ4NWY1ZmNiZGZlID0gJCgnPGRpdiBpZD0iaHRtbF9mMjYyZjAzZTVkNDg0NTY3OWQ5YmJkODVmNWZjYmRmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0MzlkNWI4OGE3ODRlZTZhYmE3NjYzZjlhYTE3ZDA4LnNldENvbnRlbnQoaHRtbF9mMjYyZjAzZTVkNDg0NTY3OWQ5YmJkODVmNWZjYmRmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzY2ZDUwNTM4NmQ0NmE0YTcxZGIzYTQxOWFkOWQ3Ny5iaW5kUG9wdXAocG9wdXBfYzQzOWQ1Yjg4YTc4NGVlNmFiYTc2NjNmOWFhMTdkMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGExMTBmN2JmMTQyNDU2NWE3ZWYwODQwZTZiMjQ5MTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjVjNTY0YmZiMDFhNDRhYjliZTE3ZTQ3NTY0MjgzZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTkzMDZhMzZmY2NiNGQ1Yjk1YjdkYTdhMTAyNGEwMWQgPSAkKCc8ZGl2IGlkPSJodG1sXzU5MzA2YTM2ZmNjYjRkNWI5NWI3ZGE3YTEwMjRhMDFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1YzU2NGJmYjAxYTQ0YWI5YmUxN2U0NzU2NDI4M2ZiLnNldENvbnRlbnQoaHRtbF81OTMwNmEzNmZjY2I0ZDViOTViN2RhN2ExMDI0YTAxZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YTExMGY3YmYxNDI0NTY1YTdlZjA4NDBlNmIyNDkxNS5iaW5kUG9wdXAocG9wdXBfZjVjNTY0YmZiMDFhNDRhYjliZTE3ZTQ3NTY0MjgzZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjBmYTI0YzNmMjk5NDBhNGJlNWJhZjVhNDczNzkwZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdhM2U4ZDU5ZTU3NGU1ZmEwZjE0ODM2YzNlODk3NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjUwMjgyMzNlMGI3NGM5M2E2Yjk2N2QzOTEzNmMwOGEgPSAkKCc8ZGl2IGlkPSJodG1sX2I1MDI4MjMzZTBiNzRjOTNhNmI5NjdkMzkxMzZjMDhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3YTNlOGQ1OWU1NzRlNWZhMGYxNDgzNmMzZTg5NzU1LnNldENvbnRlbnQoaHRtbF9iNTAyODIzM2UwYjc0YzkzYTZiOTY3ZDM5MTM2YzA4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMGZhMjRjM2YyOTk0MGE0YmU1YmFmNWE0NzM3OTBlYi5iaW5kUG9wdXAocG9wdXBfNTdhM2U4ZDU5ZTU3NGU1ZmEwZjE0ODM2YzNlODk3NTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThkZmIyZWY1ZmI3NGJmOGFjOTJiODczODVmOThlMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjc0ZGJlZGNhZWRjNDQ0Yzg3MDhhMGY3NjQ3YTE4ZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDIzOTE2ODIzOTRmNGE4MTk3ZWFmY2VlZmVjZWU3YjUgPSAkKCc8ZGl2IGlkPSJodG1sX2QyMzkxNjgyMzk0ZjRhODE5N2VhZmNlZWZlY2VlN2I1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzRkYmVkY2FlZGM0NDRjODcwOGEwZjc2NDdhMThlMy5zZXRDb250ZW50KGh0bWxfZDIzOTE2ODIzOTRmNGE4MTk3ZWFmY2VlZmVjZWU3YjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNThkZmIyZWY1ZmI3NGJmOGFjOTJiODczODVmOThlMzguYmluZFBvcHVwKHBvcHVwXzY3NGRiZWRjYWVkYzQ0NGM4NzA4YTBmNzY0N2ExOGUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk5N2Q4YWNhM2RjZDQwNWVhNjAxYjg2Nzc3NjBjYTgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmZmNjBlZTk5N2MwNDBiZjk1NmQwYmEyOTI2NjhiNzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGJhODlmY2Q5ODY3NDdkYTgxNzg5NTc5NWYxZGM0YjUgPSAkKCc8ZGl2IGlkPSJodG1sXzRiYTg5ZmNkOTg2NzQ3ZGE4MTc4OTU3OTVmMWRjNGI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZmY2MGVlOTk3YzA0MGJmOTU2ZDBiYTI5MjY2OGI3My5zZXRDb250ZW50KGh0bWxfNGJhODlmY2Q5ODY3NDdkYTgxNzg5NTc5NWYxZGM0YjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTk3ZDhhY2EzZGNkNDA1ZWE2MDFiODY3Nzc2MGNhODAuYmluZFBvcHVwKHBvcHVwX2ZmZjYwZWU5OTdjMDQwYmY5NTZkMGJhMjkyNjY4YjczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3M2Q5NGJiOWVmNzQ0NWI4NTA1MWI5MmU0MTQ1MmU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmNTE4ZDBiNDVlZDRmZTE4MGEwZGJlNzY5ZDM2YTdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxYzM0YTg0MmRlYzQzY2M4NmQyZWNiN2Y4OGU2ODM2ID0gJCgnPGRpdiBpZD0iaHRtbF9mMWMzNGE4NDJkZWM0M2NjODZkMmVjYjdmODhlNjgzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZjUxOGQwYjQ1ZWQ0ZmUxODBhMGRiZTc2OWQzNmE3Yy5zZXRDb250ZW50KGh0bWxfZjFjMzRhODQyZGVjNDNjYzg2ZDJlY2I3Zjg4ZTY4MzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzczZDk0YmI5ZWY3NDQ1Yjg1MDUxYjkyZTQxNDUyZTUuYmluZFBvcHVwKHBvcHVwXzlmNTE4ZDBiNDVlZDRmZTE4MGEwZGJlNzY5ZDM2YTdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMzMDdkMWE1YTczZjQzODY5MjkzNjA0OWNlNWJiMWY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjNDUxYTNmNjU5NTRkZmE4ZjI3ZTJiZTYwMTM3MGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5ZmYwODI4OWI3ZTQ1MTdiNjUyYmNiNDRjMWQyYjY4ID0gJCgnPGRpdiBpZD0iaHRtbF9jOWZmMDgyODliN2U0NTE3YjY1MmJjYjQ0YzFkMmI2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VjNDUxYTNmNjU5NTRkZmE4ZjI3ZTJiZTYwMTM3MGYwLnNldENvbnRlbnQoaHRtbF9jOWZmMDgyODliN2U0NTE3YjY1MmJjYjQ0YzFkMmI2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMzA3ZDFhNWE3M2Y0Mzg2OTI5MzYwNDljZTViYjFmNC5iaW5kUG9wdXAocG9wdXBfZWM0NTFhM2Y2NTk1NGRmYThmMjdlMmJlNjAxMzcwZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWRmZGMyOWMxYzk1NGU3MWJhZTljZTlkOWYyMDUxN2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDliNDU3OTUyMjYzNDE2MDg5M2IwY2JkN2MyY2RkODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjk5ODdiMmNiZGRlNGU0ZDhhYWEwZGJiNjExYzFmYTMgPSAkKCc8ZGl2IGlkPSJodG1sXzY5OTg3YjJjYmRkZTRlNGQ4YWFhMGRiYjYxMWMxZmEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOWI0NTc5NTIyNjM0MTYwODkzYjBjYmQ3YzJjZGQ4My5zZXRDb250ZW50KGh0bWxfNjk5ODdiMmNiZGRlNGU0ZDhhYWEwZGJiNjExYzFmYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRmZGMyOWMxYzk1NGU3MWJhZTljZTlkOWYyMDUxN2IuYmluZFBvcHVwKHBvcHVwX2Q5YjQ1Nzk1MjI2MzQxNjA4OTNiMGNiZDdjMmNkZDgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2MDRiMjM2NThkZjQ0OGJiNzcwZjEyZDRlYTVmZTMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2MjdkNDdiYzU4OTQwNTRhOWQyMmZiYWM1MTk3YjljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiMjMwMzdjMGUzMDQ1ZWZhYmYzOGQwNTZiZTBhNDYzID0gJCgnPGRpdiBpZD0iaHRtbF8xYjIzMDM3YzBlMzA0NWVmYWJmMzhkMDU2YmUwYTQ2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2MjdkNDdiYzU4OTQwNTRhOWQyMmZiYWM1MTk3YjljLnNldENvbnRlbnQoaHRtbF8xYjIzMDM3YzBlMzA0NWVmYWJmMzhkMDU2YmUwYTQ2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NjA0YjIzNjU4ZGY0NDhiYjc3MGYxMmQ0ZWE1ZmUzMi5iaW5kUG9wdXAocG9wdXBfNzYyN2Q0N2JjNTg5NDA1NGE5ZDIyZmJhYzUxOTdiOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDMyN2JiMmMyM2Q1NGFmMjkzN2I5MzhkMTU0NTU0ZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWU3YWMwOTRlZWUzNGFkMmFlN2YwYjgzZGFkYjI3YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJhYzUwNGEzZjlkNGM2NDgyZDUyYzczZjViNWQ2ZTQgPSAkKCc8ZGl2IGlkPSJodG1sX2FiYWM1MDRhM2Y5ZDRjNjQ4MmQ1MmM3M2Y1YjVkNmU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZTdhYzA5NGVlZTM0YWQyYWU3ZjBiODNkYWRiMjdhNC5zZXRDb250ZW50KGh0bWxfYWJhYzUwNGEzZjlkNGM2NDgyZDUyYzczZjViNWQ2ZTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDMyN2JiMmMyM2Q1NGFmMjkzN2I5MzhkMTU0NTU0ZTYuYmluZFBvcHVwKHBvcHVwX2FlN2FjMDk0ZWVlMzRhZDJhZTdmMGI4M2RhZGIyN2E0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y1ZjhjNWE1ZGViNDQ5MjBhMDA3NTA0NDBmYTg1ZTEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzhjNmJhNWVlM2E0MzQ0ODgwMWE0YTdlNjY1NjU0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZTEyZDBkNGM5ODM0YTI5OTQwZWY3NjZkMjlmMTIyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmUxMmQwZDRjOTgzNGEyOTk0MGVmNzY2ZDI5ZjEyMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzhjNmJhNWVlM2E0MzQ0ODgwMWE0YTdlNjY1NjU0MC5zZXRDb250ZW50KGh0bWxfZmUxMmQwZDRjOTgzNGEyOTk0MGVmNzY2ZDI5ZjEyMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjVmOGM1YTVkZWI0NDkyMGEwMDc1MDQ0MGZhODVlMTIuYmluZFBvcHVwKHBvcHVwX2JjOGM2YmE1ZWUzYTQzNDQ4ODAxYTRhN2U2NjU2NTQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiM2UyZTE2YzM4NzQzMjNhMDgyMzYwOTU0YmExMTZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4YmY5ZjA1MjE5MzRkOGE5YjEwMzZiYjg3MDU2NzBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwODdjYWFjMDQxMjQ0ZTY5MTk4MDk2ODY4N2NlMmQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8wMDg3Y2FhYzA0MTI0NGU2OTE5ODA5Njg2ODdjZTJkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4YmY5ZjA1MjE5MzRkOGE5YjEwMzZiYjg3MDU2NzBhLnNldENvbnRlbnQoaHRtbF8wMDg3Y2FhYzA0MTI0NGU2OTE5ODA5Njg2ODdjZTJkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjNlMmUxNmMzODc0MzIzYTA4MjM2MDk1NGJhMTE2Yi5iaW5kUG9wdXAocG9wdXBfYjhiZjlmMDUyMTkzNGQ4YTliMTAzNmJiODcwNTY3MGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTI0MTJmZjMxOTkyNGM3ZWE3YmQzMWNkOWY2N2Q5ODkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhNGJjYjU1MzkyZDRkMTk5N2QxMmVhMjQxZTE3MjdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMWQ4ODdmMGE5ZDQyYzM4MjEwYThjZDJmNWIwMjQ2ID0gJCgnPGRpdiBpZD0iaHRtbF80YjFkODg3ZjBhOWQ0MmMzODIxMGE4Y2QyZjViMDI0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYTRiY2I1NTM5MmQ0ZDE5OTdkMTJlYTI0MWUxNzI3Zi5zZXRDb250ZW50KGh0bWxfNGIxZDg4N2YwYTlkNDJjMzgyMTBhOGNkMmY1YjAyNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTI0MTJmZjMxOTkyNGM3ZWE3YmQzMWNkOWY2N2Q5ODkuYmluZFBvcHVwKHBvcHVwX2JhNGJjYjU1MzkyZDRkMTk5N2QxMmVhMjQxZTE3MjdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkMzQ5NTc5MGUyNDQxMDE5NjQ5YzVkY2E5MjQ2MjFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzhhNWQ2MWZiODkzNDFiZWE3MDNkNWU5YmIyMmQzZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNiMTg1ZWJlMWI5NGY4MTkwMzI4NjVmNzc1YjRiNjggPSAkKCc8ZGl2IGlkPSJodG1sX2ZjYjE4NWViZTFiOTRmODE5MDMyODY1Zjc3NWI0YjY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4YTVkNjFmYjg5MzQxYmVhNzAzZDVlOWJiMjJkM2YzLnNldENvbnRlbnQoaHRtbF9mY2IxODVlYmUxYjk0ZjgxOTAzMjg2NWY3NzViNGI2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDM0OTU3OTBlMjQ0MTAxOTY0OWM1ZGNhOTI0NjIxZC5iaW5kUG9wdXAocG9wdXBfMzhhNWQ2MWZiODkzNDFiZWE3MDNkNWU5YmIyMmQzZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWE1YTIyNDA2MTBlNGRkMTkwMzMwNmRiZjdkMGM2ZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTYzYjM0M2FjNGE5NDdjOTllYjNkYjE1ZDkwMWRiNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNjM2ZjZGI2NjZkNDJkODgyNjM0YWIxZjU1YjQ5OWEgPSAkKCc8ZGl2IGlkPSJodG1sXzEzYzNmY2RiNjY2ZDQyZDg4MjYzNGFiMWY1NWI0OTlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U2M2IzNDNhYzRhOTQ3Yzk5ZWIzZGIxNWQ5MDFkYjZiLnNldENvbnRlbnQoaHRtbF8xM2MzZmNkYjY2NmQ0MmQ4ODI2MzRhYjFmNTViNDk5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTVhMjI0MDYxMGU0ZGQxOTAzMzA2ZGJmN2QwYzZmNS5iaW5kUG9wdXAocG9wdXBfZTYzYjM0M2FjNGE5NDdjOTllYjNkYjE1ZDkwMWRiNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzU5OTk3NjY2MTNiNGRiNjk0NjhlZTcwZGI3MjkxNzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGYzMmEwYmY1ZTY2NGJkNmE3M2M2NTBkZWJmNmVlYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGRjM2Q4ZmE0ODliNDIyNjk4NTlkMTQ0MTAzNjc2ZGEgPSAkKCc8ZGl2IGlkPSJodG1sX2RkYzNkOGZhNDg5YjQyMjY5ODU5ZDE0NDEwMzY3NmRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGYzMmEwYmY1ZTY2NGJkNmE3M2M2NTBkZWJmNmVlYmEuc2V0Q29udGVudChodG1sX2RkYzNkOGZhNDg5YjQyMjY5ODU5ZDE0NDEwMzY3NmRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1OTk5NzY2NjEzYjRkYjY5NDY4ZWU3MGRiNzI5MTc3LmJpbmRQb3B1cChwb3B1cF8wZjMyYTBiZjVlNjY0YmQ2YTczYzY1MGRlYmY2ZWViYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTVjMGRjZDE0MGQ0ZDAzOWY4NmVkY2MzNDM0YTY1OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTBiZWY3YWU3NGM0NGZkZmE3YTAzYjQxOTc1MWQ2ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWFkMGI4ZjNlYzViNDU5NTk3YjAxMzA1MzNiYTIxODkgPSAkKCc8ZGl2IGlkPSJodG1sXzlhZDBiOGYzZWM1YjQ1OTU5N2IwMTMwNTMzYmEyMTg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMGJlZjdhZTc0YzQ0ZmRmYTdhMDNiNDE5NzUxZDZmZC5zZXRDb250ZW50KGh0bWxfOWFkMGI4ZjNlYzViNDU5NTk3YjAxMzA1MzNiYTIxODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTE1YzBkY2QxNDBkNGQwMzlmODZlZGNjMzQzNGE2NTkuYmluZFBvcHVwKHBvcHVwX2UwYmVmN2FlNzRjNDRmZGZhN2EwM2I0MTk3NTFkNmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzOTQxOGVhMDg0MjQyOTU4MDEzNDQ4M2EwZjU4NGY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyODdlMjkzNTY5NTQ5ZDhhYWQwZmMzMGI5NzYxODcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyYTMyZjY5NjljZTQ1NWRiMDljZjA1Yzk4ZjQxZGQ1ID0gJCgnPGRpdiBpZD0iaHRtbF80MmEzMmY2OTY5Y2U0NTVkYjA5Y2YwNWM5OGY0MWRkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI4N2UyOTM1Njk1NDlkOGFhZDBmYzMwYjk3NjE4NzEuc2V0Q29udGVudChodG1sXzQyYTMyZjY5NjljZTQ1NWRiMDljZjA1Yzk4ZjQxZGQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYzOTQxOGVhMDg0MjQyOTU4MDEzNDQ4M2EwZjU4NGY1LmJpbmRQb3B1cChwb3B1cF8yMjg3ZTI5MzU2OTU0OWQ4YWFkMGZjMzBiOTc2MTg3MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZjdiZmQ3ZTFkMDU0NTJjYTU0ZTBmMGQxYjI3MjZhNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTIzNWYwNzg1NDg0ZTFmODQ3ZjhmYzY0YjA1ZTcwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODQ2MmZhM2RmN2U0Mzc5YTUwMzI3MjEzMTY2OGMwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTg0NjJmYTNkZjdlNDM3OWE1MDMyNzIxMzE2NjhjMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTUyMzVmMDc4NTQ4NGUxZjg0N2Y4ZmM2NGIwNWU3MGEuc2V0Q29udGVudChodG1sX2E4NDYyZmEzZGY3ZTQzNzlhNTAzMjcyMTMxNjY4YzAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRmN2JmZDdlMWQwNTQ1MmNhNTRlMGYwZDFiMjcyNmE2LmJpbmRQb3B1cChwb3B1cF8xNTIzNWYwNzg1NDg0ZTFmODQ3ZjhmYzY0YjA1ZTcwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTIxYTU4MTcxMzc0MWVhYmU4OGVkN2FmMzIyN2I0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDAwN2NlZWViOGE0OTEzYmM5Y2E3YTA2OTc1YTI0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MjM3NTZjZWE0NzI0MDY0YTVjNmEzNTE4MDU0NTM0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDIzNzU2Y2VhNDcyNDA2NGE1YzZhMzUxODA1NDUzNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0MDA3Y2VlZWI4YTQ5MTNiYzljYTdhMDY5NzVhMjRhLnNldENvbnRlbnQoaHRtbF80MjM3NTZjZWE0NzI0MDY0YTVjNmEzNTE4MDU0NTM0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTIxYTU4MTcxMzc0MWVhYmU4OGVkN2FmMzIyN2I0Mi5iaW5kUG9wdXAocG9wdXBfZjQwMDdjZWVlYjhhNDkxM2JjOWNhN2EwNjk3NWEyNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjQyOWJiOGExNzA1NDQyYjhiMjMzNTY3MzlmZDM3YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1MzE5NDYzODM4MTQyNDc5NWZmMDFiYjIxZTM0ODYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwZGEyYTA5NTgyOTRiMDJiNzQzOWRiODBhZTcxOTQ5ID0gJCgnPGRpdiBpZD0iaHRtbF80MGRhMmEwOTU4Mjk0YjAyYjc0MzlkYjgwYWU3MTk0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTMxOTQ2MzgzODE0MjQ3OTVmZjAxYmIyMWUzNDg2My5zZXRDb250ZW50KGh0bWxfNDBkYTJhMDk1ODI5NGIwMmI3NDM5ZGI4MGFlNzE5NDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjQyOWJiOGExNzA1NDQyYjhiMjMzNTY3MzlmZDM3YmYuYmluZFBvcHVwKHBvcHVwX2U1MzE5NDYzODM4MTQyNDc5NWZmMDFiYjIxZTM0ODYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1Y2RkNmM2OWFiZjRhMmZiZmQyOWMzZGQ1OTJmMDI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmM3OWU3NDYxZmE0NDViZDhhODljNGYwNTMzNmI3MDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTU1MDhmMDUzZmIzNGFmNDgzMDAxNWRiMjYyOTAzNjQgPSAkKCc8ZGl2IGlkPSJodG1sXzE1NTA4ZjA1M2ZiMzRhZjQ4MzAwMTVkYjI2MjkwMzY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzc5ZTc0NjFmYTQ0NWJkOGE4OWM0ZjA1MzM2YjcwNy5zZXRDb250ZW50KGh0bWxfMTU1MDhmMDUzZmIzNGFmNDgzMDAxNWRiMjYyOTAzNjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjVjZGQ2YzY5YWJmNGEyZmJmZDI5YzNkZDU5MmYwMjguYmluZFBvcHVwKHBvcHVwX2ZjNzllNzQ2MWZhNDQ1YmQ4YTg5YzRmMDUzMzZiNzA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3YzJhMzUzNjU1NTRhYzhiY2Q2NTFkNzJlZjU1ZDYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmIyNmE2MzdkM2FlNGFhNzljNTU3YjAyODkwOTkxZTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJmOGY2Y2EzOTBiNGZkNjk2NGNmNmFhYTM4ODNjODYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiZjhmNmNhMzkwYjRmZDY5NjRjZjZhYWEzODgzYzg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiMjZhNjM3ZDNhZTRhYTc5YzU1N2IwMjg5MDk5MWUyLnNldENvbnRlbnQoaHRtbF9mYmY4ZjZjYTM5MGI0ZmQ2OTY0Y2Y2YWFhMzg4M2M4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yN2MyYTM1MzY1NTU0YWM4YmNkNjUxZDcyZWY1NWQ2My5iaW5kUG9wdXAocG9wdXBfNmIyNmE2MzdkM2FlNGFhNzljNTU3YjAyODkwOTkxZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTA3Mjc2ZjAwNTMzNDZkNmE1YWY5OWIyNjM5ZDkxNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjNGE3MjUxZmJhNTQxZTFiMmU4MjNiZTQ2MjJhNzkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzYzczMWYxM2U3MTQwMzJiYmUxMGQxYjExZTZkNGMxID0gJCgnPGRpdiBpZD0iaHRtbF9kM2M3MzFmMTNlNzE0MDMyYmJlMTBkMWIxMWU2ZDRjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzRhNzI1MWZiYTU0MWUxYjJlODIzYmU0NjIyYTc5Mi5zZXRDb250ZW50KGh0bWxfZDNjNzMxZjEzZTcxNDAzMmJiZTEwZDFiMTFlNmQ0YzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTA3Mjc2ZjAwNTMzNDZkNmE1YWY5OWIyNjM5ZDkxNmMuYmluZFBvcHVwKHBvcHVwX2RjNGE3MjUxZmJhNTQxZTFiMmU4MjNiZTQ2MjJhNzkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4MmYxYjVhNTlmNDQ3ZTU5ZjNmNGIyZDlhNjY5NWI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4YzM2ZThkYWFhNzRiZTc4ZTY3MjhmZTc5YTc5ODAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExNGE2N2YyNTRmYTQ4OGU5MTQxM2RmMjJkYzlhMDQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9hMTRhNjdmMjU0ZmE0ODhlOTE0MTNkZjIyZGM5YTA0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4YzM2ZThkYWFhNzRiZTc4ZTY3MjhmZTc5YTc5ODAyLnNldENvbnRlbnQoaHRtbF9hMTRhNjdmMjU0ZmE0ODhlOTE0MTNkZjIyZGM5YTA0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wODJmMWI1YTU5ZjQ0N2U1OWYzZjRiMmQ5YTY2OTViNC5iaW5kUG9wdXAocG9wdXBfMDhjMzZlOGRhYWE3NGJlNzhlNjcyOGZlNzlhNzk4MDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQyYjNjNmY3ZGJmNDY4ZWI0MzI4Zjk5YmI1MTgyODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDAxMTYwNGE1ZWMzNDk3YzlkN2RhM2RhMzJlMzEzZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTgxODA0NWIzOGJlNGJiMDkxNjAxMDYzMTBmMjc1ZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2U4MTgwNDViMzhiZTRiYjA5MTYwMTA2MzEwZjI3NWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwMTE2MDRhNWVjMzQ5N2M5ZDdkYTNkYTMyZTMxM2ZjLnNldENvbnRlbnQoaHRtbF9lODE4MDQ1YjM4YmU0YmIwOTE2MDEwNjMxMGYyNzVlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDJiM2M2ZjdkYmY0NjhlYjQzMjhmOTliYjUxODI4My5iaW5kUG9wdXAocG9wdXBfMDAxMTYwNGE1ZWMzNDk3YzlkN2RhM2RhMzJlMzEzZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGNmZGQ0ODNhN2I4NDAwNmI5MzZhZmVhNDI3NTVlMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg4YzAxYzNhOThiNDEyN2EzMmFjZDRmNTIwYzQ1NmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNiZDE0YWFmMWVjNGZiNzhiNjIyNTFjOWUyMmQxYzUgPSAkKCc8ZGl2IGlkPSJodG1sXzRjYmQxNGFhZjFlYzRmYjc4YjYyMjUxYzllMjJkMWM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kODhjMDFjM2E5OGI0MTI3YTMyYWNkNGY1MjBjNDU2Yy5zZXRDb250ZW50KGh0bWxfNGNiZDE0YWFmMWVjNGZiNzhiNjIyNTFjOWUyMmQxYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGNmZGQ0ODNhN2I4NDAwNmI5MzZhZmVhNDI3NTVlMDkuYmluZFBvcHVwKHBvcHVwX2Q4OGMwMWMzYTk4YjQxMjdhMzJhY2Q0ZjUyMGM0NTZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhMTc1NDM3YzVkMTQzNzI4MGY2YjQ1Zjg4ZjIyMTEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzUzMDZjNDhkZDgyNDhhZmE2MmQ3YWRhOWI4OGUxY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2RlODBhMzJjYjBlNDcwZjhiYWJkMTNkZjgxMzA0MzggPSAkKCc8ZGl2IGlkPSJodG1sXzdkZTgwYTMyY2IwZTQ3MGY4YmFiZDEzZGY4MTMwNDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzUzMDZjNDhkZDgyNDhhZmE2MmQ3YWRhOWI4OGUxY2Muc2V0Q29udGVudChodG1sXzdkZTgwYTMyY2IwZTQ3MGY4YmFiZDEzZGY4MTMwNDM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZhMTc1NDM3YzVkMTQzNzI4MGY2YjQ1Zjg4ZjIyMTEyLmJpbmRQb3B1cChwb3B1cF9jNTMwNmM0OGRkODI0OGFmYTYyZDdhZGE5Yjg4ZTFjYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Njk3YzU4ODNiZTc0ZWIyOWVjMTJmMmQxMjIwZjc4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYzZmNTc2YWE5OWE0Yzk4YTZlNTBlZGRiYWM2YjBmMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTM5Yjg5YWZjMmE0ZTc3YWE0NjQ2MjY4YjdjMzdhZCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2UzOWI4OWFmYzJhNGU3N2FhNDY0NjI2OGI3YzM3YWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYzZmNTc2YWE5OWE0Yzk4YTZlNTBlZGRiYWM2YjBmMy5zZXRDb250ZW50KGh0bWxfM2UzOWI4OWFmYzJhNGU3N2FhNDY0NjI2OGI3YzM3YWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDY5N2M1ODgzYmU3NGViMjllYzEyZjJkMTIyMGY3ODMuYmluZFBvcHVwKHBvcHVwX2FjNmY1NzZhYTk5YTRjOThhNmU1MGVkZGJhYzZiMGYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzNjc2NjhkZmU3NTRlZWZhODNmZmE0Y2NjMDA2Zjg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDBiYmE1ZTNiNDk0NzI4ODNhZjdlNDAyMDRjNmIzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZmY3ZDE5YWVjYjM0NmI0YTE0MjIxMjYwYWVhODRkNCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGZmN2QxOWFlY2IzNDZiNGExNDIyMTI2MGFlYTg0ZDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTAwYmJhNWUzYjQ5NDcyODgzYWY3ZTQwMjA0YzZiM2Uuc2V0Q29udGVudChodG1sXzhmZjdkMTlhZWNiMzQ2YjRhMTQyMjEyNjBhZWE4NGQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YzNjc2NjhkZmU3NTRlZWZhODNmZmE0Y2NjMDA2Zjg2LmJpbmRQb3B1cChwb3B1cF85MDBiYmE1ZTNiNDk0NzI4ODNhZjdlNDAyMDRjNmIzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNDBhZGY3NmE3Nzc0Y2MxOGVhMDFkYTMyZWFiZWJkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY5NDk3ZjlhY2FhNDZiNmIyOWNjNzBmMTMyODdiZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjAyYzE2ZmI3NzIyNDlmNmJiZDBiOTE2M2M5NTczMTggPSAkKCc8ZGl2IGlkPSJodG1sXzYwMmMxNmZiNzcyMjQ5ZjZiYmQwYjkxNjNjOTU3MzE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2OTQ5N2Y5YWNhYTQ2YjZiMjljYzcwZjEzMjg3YmYxLnNldENvbnRlbnQoaHRtbF82MDJjMTZmYjc3MjI0OWY2YmJkMGI5MTYzYzk1NzMxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNDBhZGY3NmE3Nzc0Y2MxOGVhMDFkYTMyZWFiZWJkYy5iaW5kUG9wdXAocG9wdXBfODY5NDk3ZjlhY2FhNDZiNmIyOWNjNzBmMTMyODdiZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjJmZTI2MjAwOTUyNDM3MThlYTljNDBlY2ZkZTA3M2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGZmYWNjOTY5ZjZiNDQwOWFlNjFiZjkxNjY3ZDE3MzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWUyNzE4ZWVkNDlmNGRmZDk0MGUzYzQ4YTY4YzRkOTIgPSAkKCc8ZGl2IGlkPSJodG1sXzllMjcxOGVlZDQ5ZjRkZmQ5NDBlM2M0OGE2OGM0ZDkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZmZhY2M5NjlmNmI0NDA5YWU2MWJmOTE2NjdkMTczNS5zZXRDb250ZW50KGh0bWxfOWUyNzE4ZWVkNDlmNGRmZDk0MGUzYzQ4YTY4YzRkOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjJmZTI2MjAwOTUyNDM3MThlYTljNDBlY2ZkZTA3M2MuYmluZFBvcHVwKHBvcHVwXzRmZmFjYzk2OWY2YjQ0MDlhZTYxYmY5MTY2N2QxNzM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2YTEzNjcxNDAwYjRiYzA5ZWIwNmI3OTJlMTNhNTE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YzYTE3NzRlMzZmZjRjYzRhZmY1YjE4N2RkNTM1MmEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhMzYxNGMxMjZiMzQ3YzViOWFiYzZmY2I2OWE0NDdhID0gJCgnPGRpdiBpZD0iaHRtbF83YTM2MTRjMTI2YjM0N2M1YjlhYmM2ZmNiNjlhNDQ3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mM2ExNzc0ZTM2ZmY0Y2M0YWZmNWIxODdkZDUzNTJhMC5zZXRDb250ZW50KGh0bWxfN2EzNjE0YzEyNmIzNDdjNWI5YWJjNmZjYjY5YTQ0N2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjZhMTM2NzE0MDBiNGJjMDllYjA2Yjc5MmUxM2E1MTkuYmluZFBvcHVwKHBvcHVwX2YzYTE3NzRlMzZmZjRjYzRhZmY1YjE4N2RkNTM1MmEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiYmE1YjFlMzUzYTRkNDk5NDM0ZDhjNzNjNTQ3MDEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyZWQyYTVhNWU0NzRiODU4MzdkNjg1NDFkNzVmNTQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUxM2E2NTg0MmJkYzQ1MmRiMzUzNzczMDY0MDhiZGM3ID0gJCgnPGRpdiBpZD0iaHRtbF81MTNhNjU4NDJiZGM0NTJkYjM1Mzc3MzA2NDA4YmRjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzJlZDJhNWE1ZTQ3NGI4NTgzN2Q2ODU0MWQ3NWY1NDYuc2V0Q29udGVudChodG1sXzUxM2E2NTg0MmJkYzQ1MmRiMzUzNzczMDY0MDhiZGM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiYmE1YjFlMzUzYTRkNDk5NDM0ZDhjNzNjNTQ3MDEzLmJpbmRQb3B1cChwb3B1cF9jMmVkMmE1YTVlNDc0Yjg1ODM3ZDY4NTQxZDc1ZjU0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNmE4NjgwN2VkMjE0ZDQ3OGYzYWQyZWZkMWFkMjYwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kY2RhZGNlZGE5Yjk0MzlmYTU4Njc2Y2U2MDk3YTRjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNTIzNDg2ZWFjZjU0OTM2OGQ3YmY1YzRjNTUxMTUzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDUyMzQ4NmVhY2Y1NDkzNjhkN2JmNWM0YzU1MTE1MzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjZGFkY2VkYTliOTQzOWZhNTg2NzZjZTYwOTdhNGNkLnNldENvbnRlbnQoaHRtbF8wNTIzNDg2ZWFjZjU0OTM2OGQ3YmY1YzRjNTUxMTUzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNmE4NjgwN2VkMjE0ZDQ3OGYzYWQyZWZkMWFkMjYwZS5iaW5kUG9wdXAocG9wdXBfZGNkYWRjZWRhOWI5NDM5ZmE1ODY3NmNlNjA5N2E0Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjc2MjI4MWJjODgwNDYzZmI2NGNjNWY1YmZlZTU2MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2I4NDU1MTI4MjM4NDhlOTk5NjdjODJjMzk3NTkyMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjU1YjRmZmZkYTgxNGM5YWE3MzhlYzMyM2IwOGE5NTIgPSAkKCc8ZGl2IGlkPSJodG1sX2I1NWI0ZmZmZGE4MTRjOWFhNzM4ZWMzMjNiMDhhOTUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiODQ1NTEyODIzODQ4ZTk5OTY3YzgyYzM5NzU5MjJhLnNldENvbnRlbnQoaHRtbF9iNTViNGZmZmRhODE0YzlhYTczOGVjMzIzYjA4YTk1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNzYyMjgxYmM4ODA0NjNmYjY0Y2M1ZjViZmVlNTYzNC5iaW5kUG9wdXAocG9wdXBfN2I4NDU1MTI4MjM4NDhlOTk5NjdjODJjMzk3NTkyMmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWYwOTkxNmE2MTE1NDUxOGJkNzA1M2YzNWVkMTllMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiZDkwNGJiZjg0MjQ3MTRiY2NmNThjMTE3MGExNzdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwZTdlNmRhZmM4MTRiODNhMGJmOWFiMDY1MThkMDE5ID0gJCgnPGRpdiBpZD0iaHRtbF9jMGU3ZTZkYWZjODE0YjgzYTBiZjlhYjA2NTE4ZDAxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGJkOTA0YmJmODQyNDcxNGJjY2Y1OGMxMTcwYTE3N2Yuc2V0Q29udGVudChodG1sX2MwZTdlNmRhZmM4MTRiODNhMGJmOWFiMDY1MThkMDE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmMDk5MTZhNjExNTQ1MThiZDcwNTNmMzVlZDE5ZTFkLmJpbmRQb3B1cChwb3B1cF84YmQ5MDRiYmY4NDI0NzE0YmNjZjU4YzExNzBhMTc3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOTExM2FhZWMxNmE0NTQzOTU1YWZmZmEzYjM0ODMyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YmZkZjM4MTE1YmE0MTZkYmE2MGIwZWNmZWNjMTZhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTczNDIwNjA2N2U0ZDI0YjFiNmNjZDQ3M2RmN2RiNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTU3MzQyMDYwNjdlNGQyNGIxYjZjY2Q0NzNkZjdkYjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGJmZGYzODExNWJhNDE2ZGJhNjBiMGVjZmVjYzE2YTMuc2V0Q29udGVudChodG1sX2U1NzM0MjA2MDY3ZTRkMjRiMWI2Y2NkNDczZGY3ZGI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5MTEzYWFlYzE2YTQ1NDM5NTVhZmZmYTNiMzQ4MzI4LmJpbmRQb3B1cChwb3B1cF80YmZkZjM4MTE1YmE0MTZkYmE2MGIwZWNmZWNjMTZhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNDllNDVmZGU5Yjc0MjQ3OTcwODc5MzU3OTJmYTc5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Zjc5ZjIwNTU5YmM0YTc3OGM2NWFjMmFkMzAzYjc2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDQzYzNkNTlmMzY0Njc1ODIzYWRiNTdjYTUzNmFhYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQ0M2MzZDU5ZjM2NDY3NTgyM2FkYjU3Y2E1MzZhYWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWY3OWYyMDU1OWJjNGE3NzhjNjVhYzJhZDMwM2I3NjEuc2V0Q29udGVudChodG1sX2Y0NDNjM2Q1OWYzNjQ2NzU4MjNhZGI1N2NhNTM2YWFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q0OWU0NWZkZTliNzQyNDc5NzA4NzkzNTc5MmZhNzk3LmJpbmRQb3B1cChwb3B1cF81Zjc5ZjIwNTU5YmM0YTc3OGM2NWFjMmFkMzAzYjc2MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNGE3Njk1NWJhMDE0NThhOGFmNjFjYzM1NTM2MDUxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjNGU4ZTA2YTIyNTRkMmFiMzRlNDEzZTY1YzA5YzA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxNTg5M2MwYjU5NzQzNjRiM2FkOGQ3OTZhZjZjMWNlID0gJCgnPGRpdiBpZD0iaHRtbF85MTU4OTNjMGI1OTc0MzY0YjNhZDhkNzk2YWY2YzFjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjNGU4ZTA2YTIyNTRkMmFiMzRlNDEzZTY1YzA5YzA4LnNldENvbnRlbnQoaHRtbF85MTU4OTNjMGI1OTc0MzY0YjNhZDhkNzk2YWY2YzFjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNGE3Njk1NWJhMDE0NThhOGFmNjFjYzM1NTM2MDUxMS5iaW5kUG9wdXAocG9wdXBfZGM0ZThlMDZhMjI1NGQyYWIzNGU0MTNlNjVjMDljMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk4NzZmYmM5ZjIxNDAwODg1MjUzNzcyMDI5ZDFjNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmUxMmZlNjJkNDc3NDY3Y2FmNmZiNDE2YWQ5MzFmNDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGU0YmExYjQzZDNmNDYwZjkxNTg2MTk0MzM1M2JiNmMgPSAkKCc8ZGl2IGlkPSJodG1sXzhlNGJhMWI0M2QzZjQ2MGY5MTU4NjE5NDMzNTNiYjZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTEyZmU2MmQ0Nzc0NjdjYWY2ZmI0MTZhZDkzMWY0My5zZXRDb250ZW50KGh0bWxfOGU0YmExYjQzZDNmNDYwZjkxNTg2MTk0MzM1M2JiNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjk4NzZmYmM5ZjIxNDAwODg1MjUzNzcyMDI5ZDFjNmQuYmluZFBvcHVwKHBvcHVwXzJlMTJmZTYyZDQ3NzQ2N2NhZjZmYjQxNmFkOTMxZjQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4ZDFhMTYwYjQ4NTRkOGVhMzc0MTkyYWUwMmMxMjJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1MDljNmQ2YjQyZjQ3MzNhNDg0MThiZjVmZWQyMDc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyMGFhODc1ZTNjNTRiZDNhZTg4ZjBiYjNkNjU2YTcxID0gJCgnPGRpdiBpZD0iaHRtbF8yMjBhYTg3NWUzYzU0YmQzYWU4OGYwYmIzZDY1NmE3MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNTA5YzZkNmI0MmY0NzMzYTQ4NDE4YmY1ZmVkMjA3Ni5zZXRDb250ZW50KGh0bWxfMjIwYWE4NzVlM2M1NGJkM2FlODhmMGJiM2Q2NTZhNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNThkMWExNjBiNDg1NGQ4ZWEzNzQxOTJhZTAyYzEyMmMuYmluZFBvcHVwKHBvcHVwX2Q1MDljNmQ2YjQyZjQ3MzNhNDg0MThiZjVmZWQyMDc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhZDExMmJiMzNjNzRjNTdiMTAyMzA4MjY4NGRlNTVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjNDE5Nzg4Y2Q3MzRkODliMzAzZmE4OWUyZjUyZmVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkZTE1OGU0OGU5ZDRkOGU5N2JiY2M5N2ZkYjc4ZjY5ID0gJCgnPGRpdiBpZD0iaHRtbF9hZGUxNThlNDhlOWQ0ZDhlOTdiYmNjOTdmZGI3OGY2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzQxOTc4OGNkNzM0ZDg5YjMwM2ZhODllMmY1MmZlZC5zZXRDb250ZW50KGh0bWxfYWRlMTU4ZTQ4ZTlkNGQ4ZTk3YmJjYzk3ZmRiNzhmNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmFkMTEyYmIzM2M3NGM1N2IxMDIzMDgyNjg0ZGU1NWQuYmluZFBvcHVwKHBvcHVwXzFjNDE5Nzg4Y2Q3MzRkODliMzAzZmE4OWUyZjUyZmVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3MTU5ZjUzOWYyNDRhZWJiM2Q0ZjViZGRjMWQ5NjE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4OWVkOTQ2OTVmYzRkYWRiOGYxZTdiMTYyYWFmZmRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1MjI3ZjNlOTQ4ZDQyMzdhNTliYTFkZGRjODZhMWEwID0gJCgnPGRpdiBpZD0iaHRtbF9kNTIyN2YzZTk0OGQ0MjM3YTU5YmExZGRkYzg2YTFhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODllZDk0Njk1ZmM0ZGFkYjhmMWU3YjE2MmFhZmZkYy5zZXRDb250ZW50KGh0bWxfZDUyMjdmM2U5NDhkNDIzN2E1OWJhMWRkZGM4NmExYTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzcxNTlmNTM5ZjI0NGFlYmIzZDRmNWJkZGMxZDk2MTguYmluZFBvcHVwKHBvcHVwXzE4OWVkOTQ2OTVmYzRkYWRiOGYxZTdiMTYyYWFmZmRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1ZWU0MTEzYzFmZjRjZmZiOTc0MDQxZWVlYjg0Y2IxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4NDA5YmE0MDEyNDQ3MjU4MzQxMWZjYTkzNmQ0OWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxZWViY2ZkZGNmZjRhZTRhNTI0Mzc0YmQzMTk0NzU0ID0gJCgnPGRpdiBpZD0iaHRtbF80MWVlYmNmZGRjZmY0YWU0YTUyNDM3NGJkMzE5NDc1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yODQwOWJhNDAxMjQ0NzI1ODM0MTFmY2E5MzZkNDlmYi5zZXRDb250ZW50KGh0bWxfNDFlZWJjZmRkY2ZmNGFlNGE1MjQzNzRiZDMxOTQ3NTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzVlZTQxMTNjMWZmNGNmZmI5NzQwNDFlZWViODRjYjEuYmluZFBvcHVwKHBvcHVwXzI4NDA5YmE0MDEyNDQ3MjU4MzQxMWZjYTkzNmQ0OWZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2NmVkODhkMTcxNDRiNDVhMDY1YTZhZDVkN2E1NjQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNTAxMmQ4NzA4MDQyNDQ5N2NjNzg2ZDhhZjk3YzI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VjNzAyYzU5NjRiOTRkYWY4OTZhYzg3ZDliZWY5OThkID0gJCgnPGRpdiBpZD0iaHRtbF9lYzcwMmM1OTY0Yjk0ZGFmODk2YWM4N2Q5YmVmOTk4ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkNTAxMmQ4NzA4MDQyNDQ5N2NjNzg2ZDhhZjk3YzI3LnNldENvbnRlbnQoaHRtbF9lYzcwMmM1OTY0Yjk0ZGFmODk2YWM4N2Q5YmVmOTk4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNjZlZDg4ZDE3MTQ0YjQ1YTA2NWE2YWQ1ZDdhNTY0NS5iaW5kUG9wdXAocG9wdXBfY2Q1MDEyZDg3MDgwNDI0NDk3Y2M3ODZkOGFmOTdjMjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBiMGVkNTkzZDNlNDE4ZmIwMjFjYzdkZjM2N2FjMTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2IyOWJlNjc2MDM0NGYyODgwMjYyNjBkNTI1ZDFjNWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTM1YmU5ZWQwZGVjNGRkMTg3MTlkOTU1YmE3MWRjODUgPSAkKCc8ZGl2IGlkPSJodG1sXzEzNWJlOWVkMGRlYzRkZDE4NzE5ZDk1NWJhNzFkYzg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2IyOWJlNjc2MDM0NGYyODgwMjYyNjBkNTI1ZDFjNWMuc2V0Q29udGVudChodG1sXzEzNWJlOWVkMGRlYzRkZDE4NzE5ZDk1NWJhNzFkYzg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQwYjBlZDU5M2QzZTQxOGZiMDIxY2M3ZGYzNjdhYzE2LmJpbmRQb3B1cChwb3B1cF83YjI5YmU2NzYwMzQ0ZjI4ODAyNjI2MGQ1MjVkMWM1Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYzhkNDNjMGE5MjY0NjA0YjRjODQ4YTkyYWExYTQwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZjOTNmZWViYTkxNDQ5YmJiNzlmNmU1Y2MwYjc0OWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjE3ZWRlY2VlZDIzNDkxMGFjMTcyMWE5MGY2MDZjY2MgPSAkKCc8ZGl2IGlkPSJodG1sXzYxN2VkZWNlZWQyMzQ5MTBhYzE3MjFhOTBmNjA2Y2NjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGZjOTNmZWViYTkxNDQ5YmJiNzlmNmU1Y2MwYjc0OWEuc2V0Q29udGVudChodG1sXzYxN2VkZWNlZWQyMzQ5MTBhYzE3MjFhOTBmNjA2Y2NjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjOGQ0M2MwYTkyNjQ2MDRiNGM4NDhhOTJhYTFhNDA4LmJpbmRQb3B1cChwb3B1cF9kZmM5M2ZlZWJhOTE0NDliYmI3OWY2ZTVjYzBiNzQ5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOWYzNTc5NWQ4MDQ0ZGY3YTgwYzVjODJmNDVhYmMwYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDllMGM5NWQ4ZWE0Zjc2YmRlYTQwMWRjNzQ5ODFhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTMzNmVjNzJkMTk0NjYwYjQzYmYwMDU5YmQ2YmY2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2EzMzZlYzcyZDE5NDY2MGI0M2JmMDA1OWJkNmJmNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwOWUwYzk1ZDhlYTRmNzZiZGVhNDAxZGM3NDk4MWEzLnNldENvbnRlbnQoaHRtbF9jYTMzNmVjNzJkMTk0NjYwYjQzYmYwMDU5YmQ2YmY2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOWYzNTc5NWQ4MDQ0ZGY3YTgwYzVjODJmNDVhYmMwYy5iaW5kUG9wdXAocG9wdXBfMTA5ZTBjOTVkOGVhNGY3NmJkZWE0MDFkYzc0OTgxYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODVkMzdhMmRkNjRmNDkzMzk0MGVlNjdjNWZmNzk4MGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTkwNmYyZTdkN2NkNDQzNjhhNWQ1NmRmMmIzODk4ODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDEyNDhlZWRlYjlkNDk4ZWIzN2I5MGNhYTBhNzc2YzMgPSAkKCc8ZGl2IGlkPSJodG1sXzQxMjQ4ZWVkZWI5ZDQ5OGViMzdiOTBjYWEwYTc3NmMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTkwNmYyZTdkN2NkNDQzNjhhNWQ1NmRmMmIzODk4ODUuc2V0Q29udGVudChodG1sXzQxMjQ4ZWVkZWI5ZDQ5OGViMzdiOTBjYWEwYTc3NmMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1ZDM3YTJkZDY0ZjQ5MzM5NDBlZTY3YzVmZjc5ODBkLmJpbmRQb3B1cChwb3B1cF8xOTA2ZjJlN2Q3Y2Q0NDM2OGE1ZDU2ZGYyYjM4OTg4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZWQ5MjlhNTkxZjI0NzNjYTc4YjBkNzk4ZjM1NGY5ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMzMwZjY3ZWNjYjE0OGUyYmUwMGQ3N2VmYzYyMDY4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZGE3Y2U4NTA2ODc0MjkwOWRjYjNlYzE4MjU1MWExYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmRhN2NlODUwNjg3NDI5MDlkY2IzZWMxODI1NTFhMWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjMzMGY2N2VjY2IxNDhlMmJlMDBkNzdlZmM2MjA2ODcuc2V0Q29udGVudChodG1sXzZkYTdjZTg1MDY4NzQyOTA5ZGNiM2VjMTgyNTUxYTFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllZDkyOWE1OTFmMjQ3M2NhNzhiMGQ3OThmMzU0ZjllLmJpbmRQb3B1cChwb3B1cF9iMzMwZjY3ZWNjYjE0OGUyYmUwMGQ3N2VmYzYyMDY4Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZmQ4ZmFlNTM4Mzk0OGM4OTFlMzhlMWU0Y2QxZjNlZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2Q5OGM5NmEyYmM0NWE2YTRmMTAxMGE2NmU0ZjU5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNWU3NTNmODBmYjI0ZjNkOTFjYTNhZDg0MWNiYzJkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzVlNzUzZjgwZmIyNGYzZDkxY2EzYWQ4NDFjYmMyZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczZDk4Yzk2YTJiYzQ1YTZhNGYxMDEwYTY2ZTRmNTk1LnNldENvbnRlbnQoaHRtbF8zNWU3NTNmODBmYjI0ZjNkOTFjYTNhZDg0MWNiYzJkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZmQ4ZmFlNTM4Mzk0OGM4OTFlMzhlMWU0Y2QxZjNlZi5iaW5kUG9wdXAocG9wdXBfNzNkOThjOTZhMmJjNDVhNmE0ZjEwMTBhNjZlNGY1OTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzQ2YjgwYTY2MTY4NDAzZWE4NGExNGM1ZmExYjhiMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQwMDQwN2RiMGVjNGU5ODg0MWM3NTljZTNlOTcyYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWEyODI4ZTYwMGM4NDI1NTk1YTM3NzA4ODcwODhlOWIgPSAkKCc8ZGl2IGlkPSJodG1sX2VhMjgyOGU2MDBjODQyNTU5NWEzNzcwODg3MDg4ZTliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0MDA0MDdkYjBlYzRlOTg4NDFjNzU5Y2UzZTk3MmFjLnNldENvbnRlbnQoaHRtbF9lYTI4MjhlNjAwYzg0MjU1OTVhMzc3MDg4NzA4OGU5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NDZiODBhNjYxNjg0MDNlYTg0YTE0YzVmYTFiOGIzOC5iaW5kUG9wdXAocG9wdXBfOTQwMDQwN2RiMGVjNGU5ODg0MWM3NTljZTNlOTcyYWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDk1NTI1MTM3OWQ1NGRiYmFiMzI1ZDM5NzUxY2E2MTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxZDVlMGNmMWNlNjQ4MzY4NGI5MDE2NzA0ZTBiNDE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiYTUxMTUyZjQ5YjQ2OWM5NzAxZTNiYjhlOTYwNTIxID0gJCgnPGRpdiBpZD0iaHRtbF84YmE1MTE1MmY0OWI0NjljOTcwMWUzYmI4ZTk2MDUyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzFkNWUwY2YxY2U2NDgzNjg0YjkwMTY3MDRlMGI0MTUuc2V0Q29udGVudChodG1sXzhiYTUxMTUyZjQ5YjQ2OWM5NzAxZTNiYjhlOTYwNTIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q5NTUyNTEzNzlkNTRkYmJhYjMyNWQzOTc1MWNhNjEyLmJpbmRQb3B1cChwb3B1cF9jMWQ1ZTBjZjFjZTY0ODM2ODRiOTAxNjcwNGUwYjQxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNjE3NDkwOTJhMmY0NjMzYmQ3ODc1NDcwMjcyZjgyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzI3ZTIwMTdiNjc2NDYwYThhN2FhOTQzOTRhNzc0ZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDgzZDBjMzE4ZDAxNDdjMTg2ZDI5YjZjZjYxMDVlMjQgPSAkKCc8ZGl2IGlkPSJodG1sXzA4M2QwYzMxOGQwMTQ3YzE4NmQyOWI2Y2Y2MTA1ZTI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzI3ZTIwMTdiNjc2NDYwYThhN2FhOTQzOTRhNzc0ZDMuc2V0Q29udGVudChodG1sXzA4M2QwYzMxOGQwMTQ3YzE4NmQyOWI2Y2Y2MTA1ZTI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM2MTc0OTA5MmEyZjQ2MzNiZDc4NzU0NzAyNzJmODIyLmJpbmRQb3B1cChwb3B1cF83MjdlMjAxN2I2NzY0NjBhOGE3YWE5NDM5NGE3NzRkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMmZlZDBlMGI5YTc0ZDA4OTBiYTIwODU3MTA2M2U0ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTIwNjAwY2FjMmM1NDJhNzhhOGMyMDcyMjE2ZWIwYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjdlY2E0ZjM0MjUzNGMzNDljNDA5ZmY4Nzk0MTNhYmQgPSAkKCc8ZGl2IGlkPSJodG1sXzY3ZWNhNGYzNDI1MzRjMzQ5YzQwOWZmODc5NDEzYWJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyMDYwMGNhYzJjNTQyYTc4YThjMjA3MjIxNmViMGE4LnNldENvbnRlbnQoaHRtbF82N2VjYTRmMzQyNTM0YzM0OWM0MDlmZjg3OTQxM2FiZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMmZlZDBlMGI5YTc0ZDA4OTBiYTIwODU3MTA2M2U0ZS5iaW5kUG9wdXAocG9wdXBfNTIwNjAwY2FjMmM1NDJhNzhhOGMyMDcyMjE2ZWIwYTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGI5ZTcyMGUyNTJlNDY0MWEzY2VjOTk2OWJhYzBjNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhZWFkZDc0OTE5ZTQ0YzZhYzFhOTg2MDFiYjBjOTllID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjODFjZDliNDY3NzQ3NWI5OTY2MmY4Njk5MDc1NGM4ID0gJCgnPGRpdiBpZD0iaHRtbF8xYzgxY2Q5YjQ2Nzc0NzViOTk2NjJmODY5OTA3NTRjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2FlYWRkNzQ5MTllNDRjNmFjMWE5ODYwMWJiMGM5OWUuc2V0Q29udGVudChodG1sXzFjODFjZDliNDY3NzQ3NWI5OTY2MmY4Njk5MDc1NGM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RiOWU3MjBlMjUyZTQ2NDFhM2NlYzk5NjliYWMwYzY4LmJpbmRQb3B1cChwb3B1cF8zYWVhZGQ3NDkxOWU0NGM2YWMxYTk4NjAxYmIwYzk5ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MWUxMTJmZTY4ODc0Yzg5OTJhZDcwNDBlYWM5OTk4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNGU3ZjRjNmJiM2Q0NTgxOGExMDdmNzcwYmYwOTRhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjU0Y2E4YTcwZDM0NWQ1YjFlZGIxMWJkZWQ3NzRkYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDY1NGNhOGE3MGQzNDVkNWIxZWRiMTFiZGVkNzc0ZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzRlN2Y0YzZiYjNkNDU4MThhMTA3Zjc3MGJmMDk0YWIuc2V0Q29udGVudChodG1sX2Q2NTRjYThhNzBkMzQ1ZDViMWVkYjExYmRlZDc3NGRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxZTExMmZlNjg4NzRjODk5MmFkNzA0MGVhYzk5OThkLmJpbmRQb3B1cChwb3B1cF9jNGU3ZjRjNmJiM2Q0NTgxOGExMDdmNzcwYmYwOTRhYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZDE4ZmRkYzY2ZTE0MWEyYTJiNTkwMTUwNWViNWQzNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmQ3ZDc0Mjk2M2I3NDU2OGIwNDBjNzU1MmM4ZjUyZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTE0NGI5ODdjYjY0NDQyYmIyODFjM2JiMDg1MWY5NjAgPSAkKCc8ZGl2IGlkPSJodG1sXzkxNDRiOTg3Y2I2NDQ0MmJiMjgxYzNiYjA4NTFmOTYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQ3ZDc0Mjk2M2I3NDU2OGIwNDBjNzU1MmM4ZjUyZDAuc2V0Q29udGVudChodG1sXzkxNDRiOTg3Y2I2NDQ0MmJiMjgxYzNiYjA4NTFmOTYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JkMThmZGRjNjZlMTQxYTJhMmI1OTAxNTA1ZWI1ZDM2LmJpbmRQb3B1cChwb3B1cF9mZDdkNzQyOTYzYjc0NTY4YjA0MGM3NTUyYzhmNTJkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZTU2Njg4OTY4NDg0MzM4OGM2MjNjODM1NmIwNWI0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTc4MjdmZDg0MjY0OTkwODVmZWVkYzViNmIxYjZjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZjEwNGJiNjdiZTk0NWZjYjkwMzNmYTcyMjY5NjBmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWYxMDRiYjY3YmU5NDVmY2I5MDMzZmE3MjI2OTYwZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWU3ODI3ZmQ4NDI2NDk5MDg1ZmVlZGM1YjZiMWI2YzYuc2V0Q29udGVudChodG1sXzlmMTA0YmI2N2JlOTQ1ZmNiOTAzM2ZhNzIyNjk2MGZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlNTY2ODg5Njg0ODQzMzg4YzYyM2M4MzU2YjA1YjQ3LmJpbmRQb3B1cChwb3B1cF9hZTc4MjdmZDg0MjY0OTkwODVmZWVkYzViNmIxYjZjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZjYzYzlkMDMyZWU0NDRmOTk5YTViNTE4NGFkZTM0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTY3ZmJkNDg3MGE0MWU0ODBjYmUxM2Y3YzViNDczZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDYyYWM4MTMyYmE0ZDRkYTAxN2Q1NDUyMjc4OTI3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODQ2MmFjODEzMmJhNGQ0ZGEwMTdkNTQ1MjI3ODkyN2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTY3ZmJkNDg3MGE0MWU0ODBjYmUxM2Y3YzViNDczZC5zZXRDb250ZW50KGh0bWxfODQ2MmFjODEzMmJhNGQ0ZGEwMTdkNTQ1MjI3ODkyN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWY2M2M5ZDAzMmVlNDQ0Zjk5OWE1YjUxODRhZGUzNDUuYmluZFBvcHVwKHBvcHVwXzlhNjdmYmQ0ODcwYTQxZTQ4MGNiZTEzZjdjNWI0NzNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkOWRlYTk3OGJiNzRjNjNhNWJmNWRkNjQzMjk2ZDQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkYTMwOGJhYzY2ODRkYmQ5MWEzYjlkNGY0Y2QxNDVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3ZTU4Y2NlYmQ5YTRkNGQ4NmQ1NDU1MThjMWM2Yzk4ID0gJCgnPGRpdiBpZD0iaHRtbF9mN2U1OGNjZWJkOWE0ZDRkODZkNTQ1NTE4YzFjNmM5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkYTMwOGJhYzY2ODRkYmQ5MWEzYjlkNGY0Y2QxNDVhLnNldENvbnRlbnQoaHRtbF9mN2U1OGNjZWJkOWE0ZDRkODZkNTQ1NTE4YzFjNmM5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDlkZWE5NzhiYjc0YzYzYTViZjVkZDY0MzI5NmQ0NS5iaW5kUG9wdXAocG9wdXBfZGRhMzA4YmFjNjY4NGRiZDkxYTNiOWQ0ZjRjZDE0NWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQwYjFiMjVhZTUzNGRlMGE5M2YwMTJkYTM2Zjg1ZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmYjFjMzhmMmEzYjQ3Njc4M2M1NTYxZjE1OTJhNjIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ3MDkzNzI4ZDU3ODQwMzU5MTc5MTNmNTM4NjVlMDIzID0gJCgnPGRpdiBpZD0iaHRtbF80NzA5MzcyOGQ1Nzg0MDM1OTE3OTEzZjUzODY1ZTAyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmYjFjMzhmMmEzYjQ3Njc4M2M1NTYxZjE1OTJhNjIzLnNldENvbnRlbnQoaHRtbF80NzA5MzcyOGQ1Nzg0MDM1OTE3OTEzZjUzODY1ZTAyMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDBiMWIyNWFlNTM0ZGUwYTkzZjAxMmRhMzZmODVkYS5iaW5kUG9wdXAocG9wdXBfOGZiMWMzOGYyYTNiNDc2NzgzYzU1NjFmMTU5MmE2MjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmNhODU5MGU0OWNhNGQzYmJmYjc4MjMwNmQxNThlZjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTEzZDJjMDFiNTg3NGNmODhlZjdmMjkwYTVhZDE3ZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2RjNTEwMTE1ODJhNDcxMjhmZDhmM2UzNmE5M2Y5MWQgPSAkKCc8ZGl2IGlkPSJodG1sX2NkYzUxMDExNTgyYTQ3MTI4ZmQ4ZjNlMzZhOTNmOTFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTEzZDJjMDFiNTg3NGNmODhlZjdmMjkwYTVhZDE3Zjkuc2V0Q29udGVudChodG1sX2NkYzUxMDExNTgyYTQ3MTI4ZmQ4ZjNlMzZhOTNmOTFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZjYTg1OTBlNDljYTRkM2JiZmI3ODIzMDZkMTU4ZWY0LmJpbmRQb3B1cChwb3B1cF81MTNkMmMwMWI1ODc0Y2Y4OGVmN2YyOTBhNWFkMTdmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzM2YmExYzI5YTE0YTEzOTg4MDJhNzg0NGZmYjA5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZWZlMzZkZjRhNGI0YzY4YWZmOTcyODFlYjJlYzUxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTRlOTZiNjNlMGU0YzNmYjJkN2QyMmRkY2E5ZmQ4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTk0ZTk2YjYzZTBlNGMzZmIyZDdkMjJkZGNhOWZkOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmVmZTM2ZGY0YTRiNGM2OGFmZjk3MjgxZWIyZWM1MWUuc2V0Q29udGVudChodG1sX2E5NGU5NmI2M2UwZTRjM2ZiMmQ3ZDIyZGRjYTlmZDhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzMzZiYTFjMjlhMTRhMTM5ODgwMmE3ODQ0ZmZiMDk3LmJpbmRQb3B1cChwb3B1cF82ZWZlMzZkZjRhNGI0YzY4YWZmOTcyODFlYjJlYzUxZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jN2EyNzFjYjI2NjY0NDQ0ODUwNzhkMjBiMWQ3NjllNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGEwNDA2MmEyM2Y0NDQ0YmIzOGM3ZDhhOTc3MzYxMjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTkxYjE1YjEwMWEwNDUxY2EyMGYzODAzZjQ5NjU5NTIgPSAkKCc8ZGl2IGlkPSJodG1sX2E5MWIxNWIxMDFhMDQ1MWNhMjBmMzgwM2Y0OTY1OTUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTA0MDYyYTIzZjQ0NDRiYjM4YzdkOGE5NzczNjEyNi5zZXRDb250ZW50KGh0bWxfYTkxYjE1YjEwMWEwNDUxY2EyMGYzODAzZjQ5NjU5NTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzdhMjcxY2IyNjY2NDQ0NDg1MDc4ZDIwYjFkNzY5ZTcuYmluZFBvcHVwKHBvcHVwX2RhMDQwNjJhMjNmNDQ0NGJiMzhjN2Q4YTk3NzM2MTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzMmZmMWJhYjM2NzRiZGNiMmIxYzQxMDg4MjIwOTFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjU0NWRlZjE5ODM0NTFkYTE4NjAxOTQzNGNlZmY3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMTM0MDI3OWM2YWU0YTU0OTUyNzZhZmIwMzc5YTUzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjEzNDAyNzljNmFlNGE1NDk1Mjc2YWZiMDM3OWE1M2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI1NDVkZWYxOTgzNDUxZGExODYwMTk0MzRjZWZmNzcuc2V0Q29udGVudChodG1sXzIxMzQwMjc5YzZhZTRhNTQ5NTI3NmFmYjAzNzlhNTNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzMmZmMWJhYjM2NzRiZGNiMmIxYzQxMDg4MjIwOTFmLmJpbmRQb3B1cChwb3B1cF8yMjU0NWRlZjE5ODM0NTFkYTE4NjAxOTQzNGNlZmY3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OWY5MzJhNjk1NGQ0OThkYjllNGE3ZmU0OTU0NDI1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWViNWI2Mzg5YmQ0MDFlODc4NWJiZDQwZDlhMWY4ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Yjc4ZWRkMTdmNmY0ZGY1ODRkODc2MWQyMmVhOWM5NyA9ICQoJzxkaXYgaWQ9Imh0bWxfOGI3OGVkZDE3ZjZmNGRmNTg0ZDg3NjFkMjJlYTljOTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1ZWI1YjYzODliZDQwMWU4Nzg1YmJkNDBkOWExZjhmLnNldENvbnRlbnQoaHRtbF84Yjc4ZWRkMTdmNmY0ZGY1ODRkODc2MWQyMmVhOWM5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OWY5MzJhNjk1NGQ0OThkYjllNGE3ZmU0OTU0NDI1Ni5iaW5kUG9wdXAocG9wdXBfNTVlYjViNjM4OWJkNDAxZTg3ODViYmQ0MGQ5YTFmOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzlkZTk0ZDRmMmI1NGU3ODkxN2QzYjNlNGM0MTgyNDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzM5OTI4MGVmMzIwNGFmNGJkZjRmOTY0N2NkZDg3YWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjczMzJmNWQxOWE3NDQ4Mjk1NTliNWQ1MWFhYWU3N2UgPSAkKCc8ZGl2IGlkPSJodG1sX2I3MzMyZjVkMTlhNzQ0ODI5NTU5YjVkNTFhYWFlNzdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Mzk5MjgwZWYzMjA0YWY0YmRmNGY5NjQ3Y2RkODdhZC5zZXRDb250ZW50KGh0bWxfYjczMzJmNWQxOWE3NDQ4Mjk1NTliNWQ1MWFhYWU3N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzlkZTk0ZDRmMmI1NGU3ODkxN2QzYjNlNGM0MTgyNDAuYmluZFBvcHVwKHBvcHVwXzczOTkyODBlZjMyMDRhZjRiZGY0Zjk2NDdjZGQ4N2FkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4OGRmZGIxOTUzNzRhNzE5M2Q2NTE2ZmMyMTYwMzk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxM2FmZGMzZGU5MjQyZDc4N2EzMGMzYjkyNWY5NDhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxOTZmNjgwOTBlZjQzOGJiZWUzMWI4YWJhYjc0MTgyID0gJCgnPGRpdiBpZD0iaHRtbF8wMTk2ZjY4MDkwZWY0MzhiYmVlMzFiOGFiYWI3NDE4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxM2FmZGMzZGU5MjQyZDc4N2EzMGMzYjkyNWY5NDhjLnNldENvbnRlbnQoaHRtbF8wMTk2ZjY4MDkwZWY0MzhiYmVlMzFiOGFiYWI3NDE4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ODhkZmRiMTk1Mzc0YTcxOTNkNjUxNmZjMjE2MDM5NS5iaW5kUG9wdXAocG9wdXBfNjEzYWZkYzNkZTkyNDJkNzg3YTMwYzNiOTI1Zjk0OGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzkwOGM2MWU4ZDM5NDMzODhlOGQyNTcxNjViOGM0N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwYzlkZTRjZjJlMzQxMDBiNWE1MjBiMTkyNWY3ZDU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlNDRmYzg3NzVlZDRkY2NhZTA2NTVhZTA1NDk0MGRhID0gJCgnPGRpdiBpZD0iaHRtbF9mZTQ0ZmM4Nzc1ZWQ0ZGNjYWUwNjU1YWUwNTQ5NDBkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTBjOWRlNGNmMmUzNDEwMGI1YTUyMGIxOTI1ZjdkNTcuc2V0Q29udGVudChodG1sX2ZlNDRmYzg3NzVlZDRkY2NhZTA2NTVhZTA1NDk0MGRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5MDhjNjFlOGQzOTQzMzg4ZThkMjU3MTY1YjhjNDdjLmJpbmRQb3B1cChwb3B1cF9lMGM5ZGU0Y2YyZTM0MTAwYjVhNTIwYjE5MjVmN2Q1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80M2E5ZGI3MmI0OTA0ZGNiYWUwZGM2MjJhN2VkZDQ4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTM2YThmZGQxMDMzNDc5MDliNjBhYTMzZGVhYzM4NmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGUxMjUxYjFjMmY4NDZhOThjNGQwMWUzNTkwMTYxNTAgPSAkKCc8ZGl2IGlkPSJodG1sXzBlMTI1MWIxYzJmODQ2YTk4YzRkMDFlMzU5MDE2MTUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM2YThmZGQxMDMzNDc5MDliNjBhYTMzZGVhYzM4NmUuc2V0Q29udGVudChodG1sXzBlMTI1MWIxYzJmODQ2YTk4YzRkMDFlMzU5MDE2MTUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzYTlkYjcyYjQ5MDRkY2JhZTBkYzYyMmE3ZWRkNDg4LmJpbmRQb3B1cChwb3B1cF85MzZhOGZkZDEwMzM0NzkwOWI2MGFhMzNkZWFjMzg2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOTZmZGY4NjBkZDE0Y2Y1ODdjNGU4OGY3MWZlOTE3MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTQ4MGE1YWViNTQ3NDAyNWE5YzI1ZDg1M2JiYTc4MGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGNiZTJjMDk3OTE5NDA1MzgyZTFjYjE0NmE1NjMwYzIgPSAkKCc8ZGl2IGlkPSJodG1sXzBjYmUyYzA5NzkxOTQwNTM4MmUxY2IxNDZhNTYzMGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDgwYTVhZWI1NDc0MDI1YTljMjVkODUzYmJhNzgwZi5zZXRDb250ZW50KGh0bWxfMGNiZTJjMDk3OTE5NDA1MzgyZTFjYjE0NmE1NjMwYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjk2ZmRmODYwZGQxNGNmNTg3YzRlODhmNzFmZTkxNzAuYmluZFBvcHVwKHBvcHVwX2U0ODBhNWFlYjU0NzQwMjVhOWMyNWQ4NTNiYmE3ODBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2YWRjMjFkMzU0ZjRlZWM4OGEzZDA1NjdjOGQyZGE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTIzMDVjMjNmNDc0ZDA3OWVlODc0ZjIwNmI1YThmNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTNmOGIzNWQxMzQ0ZmI3YjEwODcwYmIxYjhhYWI4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDUzZjhiMzVkMTM0NGZiN2IxMDg3MGJiMWI4YWFiOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjEyMzA1YzIzZjQ3NGQwNzllZTg3NGYyMDZiNWE4Zjcuc2V0Q29udGVudChodG1sX2Q1M2Y4YjM1ZDEzNDRmYjdiMTA4NzBiYjFiOGFhYjhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2YWRjMjFkMzU0ZjRlZWM4OGEzZDA1NjdjOGQyZGE3LmJpbmRQb3B1cChwb3B1cF9mMTIzMDVjMjNmNDc0ZDA3OWVlODc0ZjIwNmI1YThmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNzFiYTI4NmZlYmM0MTk1OGYzZTA3MTRjNjI0OTU1ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDQzYzNkN2ZhNmVjNDU2Yzg3NjJmMjQzYzk5NWRkNzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI0NTdhZWVkNTJmNGQ4MDlkNTg3NmViZjU1MDQzNWMgPSAkKCc8ZGl2IGlkPSJodG1sXzBiNDU3YWVlZDUyZjRkODA5ZDU4NzZlYmY1NTA0MzVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NDNjM2Q3ZmE2ZWM0NTZjODc2MmYyNDNjOTk1ZGQ3MS5zZXRDb250ZW50KGh0bWxfMGI0NTdhZWVkNTJmNGQ4MDlkNTg3NmViZjU1MDQzNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzcxYmEyODZmZWJjNDE5NThmM2UwNzE0YzYyNDk1NWYuYmluZFBvcHVwKHBvcHVwXzQ0M2MzZDdmYTZlYzQ1NmM4NzYyZjI0M2M5OTVkZDcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliNjIwOTkwNjU2ZDRiNjQ4NjE2OTllNzgyNWI3NjE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVlZmI1NDExYmY4NDExYjg2ZWQ0NWNlNzc3YWY5MDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjcyZTc4NGU4NWI2NDQwZTg4ODk5M2FkZGI2MGM1MzUgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3MmU3ODRlODViNjQ0MGU4ODg5OTNhZGRiNjBjNTM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1ZWZiNTQxMWJmODQxMWI4NmVkNDVjZTc3N2FmOTA5LnNldENvbnRlbnQoaHRtbF9mNzJlNzg0ZTg1YjY0NDBlODg4OTkzYWRkYjYwYzUzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YjYyMDk5MDY1NmQ0YjY0ODYxNjk5ZTc4MjViNzYxNC5iaW5kUG9wdXAocG9wdXBfNzVlZmI1NDExYmY4NDExYjg2ZWQ0NWNlNzc3YWY5MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmJjZWFkMTQ5ODMyNGM4OTg1MzY1YzQ5ZjdkMGRjYTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODU0ZjdiNmJkZDJmNGFkNDllMWNmZGM4NmE0NDc0OGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ5NDcxNDkyNzQyNDI1Mzk4MzBkNzA4YjM3ZDUzMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzFkOTQ3MTQ5Mjc0MjQyNTM5ODMwZDcwOGIzN2Q1MzJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1NGY3YjZiZGQyZjRhZDQ5ZTFjZmRjODZhNDQ3NDhlLnNldENvbnRlbnQoaHRtbF8xZDk0NzE0OTI3NDI0MjUzOTgzMGQ3MDhiMzdkNTMyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YmNlYWQxNDk4MzI0Yzg5ODUzNjVjNDlmN2QwZGNhMi5iaW5kUG9wdXAocG9wdXBfODU0ZjdiNmJkZDJmNGFkNDllMWNmZGM4NmE0NDc0OGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDRkNWE1YmVhMjQxNGE5NWE1OTEzMDYwMTc0ZTliZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljNDQ0YzVlMmU2MzQxOGE4NmU4NzQ4Yjk4MjBhYmY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1MTdhZmZjNzY0NTQzZWE5ZGFjZWVlOGUwY2YzYjI2ID0gJCgnPGRpdiBpZD0iaHRtbF82NTE3YWZmYzc2NDU0M2VhOWRhY2VlZThlMGNmM2IyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzQ0NGM1ZTJlNjM0MThhODZlODc0OGI5ODIwYWJmNS5zZXRDb250ZW50KGh0bWxfNjUxN2FmZmM3NjQ1NDNlYTlkYWNlZWU4ZTBjZjNiMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDRkNWE1YmVhMjQxNGE5NWE1OTEzMDYwMTc0ZTliZWQuYmluZFBvcHVwKHBvcHVwXzljNDQ0YzVlMmU2MzQxOGE4NmU4NzQ4Yjk4MjBhYmY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3MjE0MWY0NjA2YzRkZDFhYmFlZDc4ZTg0NDUzOTU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYTllZDcwYjEyN2M0ZDZjYmE4NjczYTYxYzYyZTkwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzI2Zjc3ZDJiNDc0ZmZkYThlNmFiZDAzN2ExZTBjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjMyNmY3N2QyYjQ3NGZmZGE4ZTZhYmQwMzdhMWUwYzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYTllZDcwYjEyN2M0ZDZjYmE4NjczYTYxYzYyZTkwYy5zZXRDb250ZW50KGh0bWxfYjMyNmY3N2QyYjQ3NGZmZGE4ZTZhYmQwMzdhMWUwYzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTcyMTQxZjQ2MDZjNGRkMWFiYWVkNzhlODQ0NTM5NTUuYmluZFBvcHVwKHBvcHVwX2JhOWVkNzBiMTI3YzRkNmNiYTg2NzNhNjFjNjJlOTBjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzNTRjOGIxYTE3NzQzMWI5MDk1NDBmZGUzMWQyOTZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZDcwNTljMGZkNjg0MjA3OTc2YWM3NDg2NGY4YTcyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NmNmZTliMzQ5ZTc0YWQ2YmM5ZTIwZTVjYWY5OGE1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDZjZmU5YjM0OWU3NGFkNmJjOWUyMGU1Y2FmOThhNTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZDcwNTljMGZkNjg0MjA3OTc2YWM3NDg2NGY4YTcyMi5zZXRDb250ZW50KGh0bWxfNDZjZmU5YjM0OWU3NGFkNmJjOWUyMGU1Y2FmOThhNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjM1NGM4YjFhMTc3NDMxYjkwOTU0MGZkZTMxZDI5NmMuYmluZFBvcHVwKHBvcHVwX2JkNzA1OWMwZmQ2ODQyMDc5NzZhYzc0ODY0ZjhhNzIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U2OTBiMjQ1MmZlYjRkMGNiNGMxNDk2NGExZjdhMDU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyMDY3MWYyNzVkNTQzMTE5NzE4ZTY4ODBiNWU3ZWM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1MWQ2NzVkZDFkNzRjMDQ5ODhhZjQwNzA2NGY5NzRmID0gJCgnPGRpdiBpZD0iaHRtbF9jNTFkNjc1ZGQxZDc0YzA0OTg4YWY0MDcwNjRmOTc0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjIwNjcxZjI3NWQ1NDMxMTk3MThlNjg4MGI1ZTdlYzYuc2V0Q29udGVudChodG1sX2M1MWQ2NzVkZDFkNzRjMDQ5ODhhZjQwNzA2NGY5NzRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2OTBiMjQ1MmZlYjRkMGNiNGMxNDk2NGExZjdhMDU2LmJpbmRQb3B1cChwb3B1cF82MjA2NzFmMjc1ZDU0MzExOTcxOGU2ODgwYjVlN2VjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MjA0YTVhMGMzZWE0MzBlYTkzOTYxNTM4NTVhNzkxMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNTllMWJlMDM2MWU0NDM1YjUzYTJhMzQ4ZmQ4NTQzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMzY1NjcyNWRjZjU0ZDJlOTNmMjQxZWIyODJhYzAxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjM2NTY3MjVkY2Y1NGQyZTkzZjI0MWViMjgyYWMwMTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1OWUxYmUwMzYxZTQ0MzViNTNhMmEzNDhmZDg1NDM0LnNldENvbnRlbnQoaHRtbF8yMzY1NjcyNWRjZjU0ZDJlOTNmMjQxZWIyODJhYzAxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MjA0YTVhMGMzZWE0MzBlYTkzOTYxNTM4NTVhNzkxMC5iaW5kUG9wdXAocG9wdXBfMDU5ZTFiZTAzNjFlNDQzNWI1M2EyYTM0OGZkODU0MzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDA0Njc5OTM0YWZmNGY2ZThlM2I5NmIxYzhhZDkzZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGRlMzE4OWVjOWRiNDlhOWE2YzBhMjlhZTJlOGI2N2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjNiZTJlMjE3NGYxNGIzNjljOGVkNGI3YmRjNjQ1YTMgPSAkKCc8ZGl2IGlkPSJodG1sX2IzYmUyZTIxNzRmMTRiMzY5YzhlZDRiN2JkYzY0NWEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGRlMzE4OWVjOWRiNDlhOWE2YzBhMjlhZTJlOGI2N2Quc2V0Q29udGVudChodG1sX2IzYmUyZTIxNzRmMTRiMzY5YzhlZDRiN2JkYzY0NWEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwNDY3OTkzNGFmZjRmNmU4ZTNiOTZiMWM4YWQ5M2U3LmJpbmRQb3B1cChwb3B1cF9kZGUzMTg5ZWM5ZGI0OWE5YTZjMGEyOWFlMmU4YjY3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NTgwNGFlYzdlYzE0ZjgzOGY2NWQ4NTNmYjJkM2RhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWFlNzI3MzRiMGZhNDQ5ZDg4ZGY4MTJjMTgwNmZmNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjdlMzIyZGYwNGQ2NDlhZmE5ZGVmN2Q2MjgxMWU2NjggPSAkKCc8ZGl2IGlkPSJodG1sX2Y3ZTMyMmRmMDRkNjQ5YWZhOWRlZjdkNjI4MTFlNjY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWFlNzI3MzRiMGZhNDQ5ZDg4ZGY4MTJjMTgwNmZmNTYuc2V0Q29udGVudChodG1sX2Y3ZTMyMmRmMDRkNjQ5YWZhOWRlZjdkNjI4MTFlNjY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1ODA0YWVjN2VjMTRmODM4ZjY1ZDg1M2ZiMmQzZGFlLmJpbmRQb3B1cChwb3B1cF9lYWU3MjczNGIwZmE0NDlkODhkZjgxMmMxODA2ZmY1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Yjk1ZGY1MDFhZDY0MDQ4OTk5YmEyOWM4NmI3YWQ5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjFiM2EzMWYxY2I0Y2E1OWViOWJhZmNkNmM0YjFkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZTY4ZmQwYjk2NDA0MTAyOWJiMWJkNDIyNzQ5MmZmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2U2OGZkMGI5NjQwNDEwMjliYjFiZDQyMjc0OTJmZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMjFiM2EzMWYxY2I0Y2E1OWViOWJhZmNkNmM0YjFkMy5zZXRDb250ZW50KGh0bWxfY2U2OGZkMGI5NjQwNDEwMjliYjFiZDQyMjc0OTJmZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI5NWRmNTAxYWQ2NDA0ODk5OWJhMjljODZiN2FkOTguYmluZFBvcHVwKHBvcHVwX2IyMWIzYTMxZjFjYjRjYTU5ZWI5YmFmY2Q2YzRiMWQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjNjhlNGY0YTcwMTRlN2NiNjIxYmNhOWRjN2Q3ZWRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NGE4NjQ4YTcyYTQwNzY4MzQ0MTI3NjYxOWUyY2NiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkOWY4M2NiYmFiMTRlMDM5NzdhMWY4ZGNiY2FhOTUyID0gJCgnPGRpdiBpZD0iaHRtbF84ZDlmODNjYmJhYjE0ZTAzOTc3YTFmOGRjYmNhYTk1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjRhODY0OGE3MmE0MDc2ODM0NDEyNzY2MTllMmNjYi5zZXRDb250ZW50KGh0bWxfOGQ5ZjgzY2JiYWIxNGUwMzk3N2ExZjhkY2JjYWE5NTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWM2OGU0ZjRhNzAxNGU3Y2I2MjFiY2E5ZGM3ZDdlZGIuYmluZFBvcHVwKHBvcHVwXzE2NGE4NjQ4YTcyYTQwNzY4MzQ0MTI3NjYxOWUyY2NiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwMzBmZDM2MWQ0YzQwMzE4NjFkOTZmMDk1OTQzZjUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NTYzMWY2ZGI4ZDA0M2ZlOTUwMzkwNWI2MzIyNzc1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDZiYTU1MWU5NDY0NWE4YTcyNGExZDhiMDQwNzRhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQ2YmE1NTFlOTQ2NDVhOGE3MjRhMWQ4YjA0MDc0YWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTYzMWY2ZGI4ZDA0M2ZlOTUwMzkwNWI2MzIyNzc1My5zZXRDb250ZW50KGh0bWxfNWQ2YmE1NTFlOTQ2NDVhOGE3MjRhMWQ4YjA0MDc0YWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjAzMGZkMzYxZDRjNDAzMTg2MWQ5NmYwOTU5NDNmNTEuYmluZFBvcHVwKHBvcHVwXzQ1NjMxZjZkYjhkMDQzZmU5NTAzOTA1YjYzMjI3NzUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdlOTcyMTkzNjFkNTQyOWRhYjRiMGQwNmY2OTU3YTY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY1YjY3NjYyYzZkODQzMGRiZWU1ZGY0NTQwNjA4MjBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiODNhNTIxMTM0NTQ5YWFiNGJjOWU2YzA2MmUyMDI2ID0gJCgnPGRpdiBpZD0iaHRtbF9jYjgzYTUyMTEzNDU0OWFhYjRiYzllNmMwNjJlMjAyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1YjY3NjYyYzZkODQzMGRiZWU1ZGY0NTQwNjA4MjBhLnNldENvbnRlbnQoaHRtbF9jYjgzYTUyMTEzNDU0OWFhYjRiYzllNmMwNjJlMjAyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZTk3MjE5MzYxZDU0MjlkYWI0YjBkMDZmNjk1N2E2NS5iaW5kUG9wdXAocG9wdXBfNjViNjc2NjJjNmQ4NDMwZGJlZTVkZjQ1NDA2MDgyMGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjc2YzQ1ZDVkNTZjNDM0Y2E2NDg2MmY2ZTRkNjhkYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDFmNzE0NDBkZDI0NGZlMGIyODRhNWU2NTRmNjhlZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJjYmU3YTkzYzM3NGI4NGFkNzg1YmJhMzA5MmQ3ZmQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiY2JlN2E5M2MzNzRiODRhZDc4NWJiYTMwOTJkN2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDFmNzE0NDBkZDI0NGZlMGIyODRhNWU2NTRmNjhlZTQuc2V0Q29udGVudChodG1sX2ZiY2JlN2E5M2MzNzRiODRhZDc4NWJiYTMwOTJkN2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3NmM0NWQ1ZDU2YzQzNGNhNjQ4NjJmNmU0ZDY4ZGJjLmJpbmRQb3B1cChwb3B1cF9kMWY3MTQ0MGRkMjQ0ZmUwYjI4NGE1ZTY1NGY2OGVlNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTVhZjEzOGUyMTM0Y2Y2YTViODE4ZmNmYjIyNzU5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWI4MDgzNjYzMjE0NmRjYTkzMjEwYTQ4MmJjY2JjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjkzMjI2Yjg3MGU0Y2MxOWYwYzQ3OTYzOTE1MmRmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI5MzIyNmI4NzBlNGNjMTlmMGM0Nzk2MzkxNTJkZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZWI4MDgzNjYzMjE0NmRjYTkzMjEwYTQ4MmJjY2JjNy5zZXRDb250ZW50KGh0bWxfNmI5MzIyNmI4NzBlNGNjMTlmMGM0Nzk2MzkxNTJkZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmE1YWYxMzhlMjEzNGNmNmE1YjgxOGZjZmIyMjc1OTkuYmluZFBvcHVwKHBvcHVwX2RlYjgwODM2NjMyMTQ2ZGNhOTMyMTBhNDgyYmNjYmM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwNDAwOGJjMjk3MzQwMTVhMTM1MmVjYjJiMGIzZDE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjMzE5ZWNiYjRhYTQyZDdhOGNkMmFiNTI0ZjljYjMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwY2ZiYzg5NzQ2NjQyOGQ5OTc1YzI1OTkzNTZhYWViID0gJCgnPGRpdiBpZD0iaHRtbF9lMGNmYmM4OTc0NjY0MjhkOTk3NWMyNTk5MzU2YWFlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjMzE5ZWNiYjRhYTQyZDdhOGNkMmFiNTI0ZjljYjMwLnNldENvbnRlbnQoaHRtbF9lMGNmYmM4OTc0NjY0MjhkOTk3NWMyNTk5MzU2YWFlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDQwMDhiYzI5NzM0MDE1YTEzNTJlY2IyYjBiM2QxOC5iaW5kUG9wdXAocG9wdXBfMmMzMTllY2JiNGFhNDJkN2E4Y2QyYWI1MjRmOWNiMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjg2MTZiODQ5MjQ1NDQwNzlhMzdiMjFhMDBkYjEzNzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTJhZjJhMDA3ZWQ5NDc2NGI5MDM2MTVjZDc3NWQyMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2EwNWYxZjk1MmZhNDM3OThhZGRiY2Y2Yzc3ZWQ5YmQgPSAkKCc8ZGl2IGlkPSJodG1sXzdhMDVmMWY5NTJmYTQzNzk4YWRkYmNmNmM3N2VkOWJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTJhZjJhMDA3ZWQ5NDc2NGI5MDM2MTVjZDc3NWQyMzYuc2V0Q29udGVudChodG1sXzdhMDVmMWY5NTJmYTQzNzk4YWRkYmNmNmM3N2VkOWJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4NjE2Yjg0OTI0NTQ0MDc5YTM3YjIxYTAwZGIxMzc4LmJpbmRQb3B1cChwb3B1cF9hMmFmMmEwMDdlZDk0NzY0YjkwMzYxNWNkNzc1ZDIzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NTU4NTc5NGQyM2I0NzBhYjRkZTMxM2RlOTgzNGI2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMDQ1Y2NlYTE0ZjY0NzI0YThkMTQ1YzE5MDY1Y2EzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZTkzNjA4MDYyOWI0MTE0OWM0MjdlNjNmODg2YWEwMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGU5MzYwODA2MjliNDExNDljNDI3ZTYzZjg4NmFhMDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDQ1Y2NlYTE0ZjY0NzI0YThkMTQ1YzE5MDY1Y2EzOS5zZXRDb250ZW50KGh0bWxfNGU5MzYwODA2MjliNDExNDljNDI3ZTYzZjg4NmFhMDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDU1ODU3OTRkMjNiNDcwYWI0ZGUzMTNkZTk4MzRiNjIuYmluZFBvcHVwKHBvcHVwXzIwNDVjY2VhMTRmNjQ3MjRhOGQxNDVjMTkwNjVjYTM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4NGFjOWJlODcwNjQwNjliNzc2NzI2OWM1ZWI5ZDI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NThmMjMwNDZjN2E0ZDFjOWY3NTBhMjZlMGZiMThjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzMyNWE5ZTYxNzE0MTlkOTdjOGQxMTFmNDY0NGEyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfODMzMjVhOWU2MTcxNDE5ZDk3YzhkMTExZjQ2NDRhMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTU4ZjIzMDQ2YzdhNGQxYzlmNzUwYTI2ZTBmYjE4YzAuc2V0Q29udGVudChodG1sXzgzMzI1YTllNjE3MTQxOWQ5N2M4ZDExMWY0NjQ0YTJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA4NGFjOWJlODcwNjQwNjliNzc2NzI2OWM1ZWI5ZDI5LmJpbmRQb3B1cChwb3B1cF85NThmMjMwNDZjN2E0ZDFjOWY3NTBhMjZlMGZiMThjMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Njc0Yzk5YzFiZTY0MzM5ODRjZmQ0NzRlM2U1ODRkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2IxZDVhNThlNzA5NDk5NzhjMjgxYjcwMDQyOWRmMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2IyNTZiNjQxNzYwNGIwMWFmYjE4Mjc2MmJlNjNhNDYgPSAkKCc8ZGl2IGlkPSJodG1sXzdiMjU2YjY0MTc2MDRiMDFhZmIxODI3NjJiZTYzYTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjFkNWE1OGU3MDk0OTk3OGMyODFiNzAwNDI5ZGYyZi5zZXRDb250ZW50KGh0bWxfN2IyNTZiNjQxNzYwNGIwMWFmYjE4Mjc2MmJlNjNhNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDY3NGM5OWMxYmU2NDMzOTg0Y2ZkNDc0ZTNlNTg0ZDguYmluZFBvcHVwKHBvcHVwXzNiMWQ1YTU4ZTcwOTQ5OTc4YzI4MWI3MDA0MjlkZjJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiOGIxMGE4M2EyYjQxYjdiMmJkM2ZjMTI5ODExMTMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3Nzc3MzE1OWM0NTQzZDY5MmU0YTczYzA4YWY0ZWM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwNmE0YTU4ODYyZDQ3Y2U5NmFiMzgxMmU0OWE1MTA3ID0gJCgnPGRpdiBpZD0iaHRtbF9hMDZhNGE1ODg2MmQ0N2NlOTZhYjM4MTJlNDlhNTEwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTc3NzczMTU5YzQ1NDNkNjkyZTRhNzNjMDhhZjRlYzguc2V0Q29udGVudChodG1sX2EwNmE0YTU4ODYyZDQ3Y2U5NmFiMzgxMmU0OWE1MTA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiOGIxMGE4M2EyYjQxYjdiMmJkM2ZjMTI5ODExMTMwLmJpbmRQb3B1cChwb3B1cF81Nzc3NzMxNTljNDU0M2Q2OTJlNGE3M2MwOGFmNGVjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOWU0YTg2MjQ3MTE0NDRmODk2MDVmZGQzZWI5YzIwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZGNjODYyNWYwMzY0YzIwYTExYWI2Mjc0Mzk3NDQ0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjQxM2Q3MGUxNDA0MDNhYjlmYTg3NzllZGY0OGRjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGY0MTNkNzBlMTQwNDAzYWI5ZmE4Nzc5ZWRmNDhkY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkY2M4NjI1ZjAzNjRjMjBhMTFhYjYyNzQzOTc0NDQ5LnNldENvbnRlbnQoaHRtbF84ZjQxM2Q3MGUxNDA0MDNhYjlmYTg3NzllZGY0OGRjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOWU0YTg2MjQ3MTE0NDRmODk2MDVmZGQzZWI5YzIwZi5iaW5kUG9wdXAocG9wdXBfOGRjYzg2MjVmMDM2NGMyMGExMWFiNjI3NDM5NzQ0NDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzczMTY2ZWJiNzliNGUzODg4NzEwYTQ2MWUyOGMzYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiOWVmZmUzM2I0NTRjNDZiYWZhZjYwNGUxOWViYTg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhNThhMzVhMDc3ZDQ1MjA5Zjg1MmRkOTQ3NDJjMzA1ID0gJCgnPGRpdiBpZD0iaHRtbF9hYTU4YTM1YTA3N2Q0NTIwOWY4NTJkZDk0NzQyYzMwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBiOWVmZmUzM2I0NTRjNDZiYWZhZjYwNGUxOWViYTg0LnNldENvbnRlbnQoaHRtbF9hYTU4YTM1YTA3N2Q0NTIwOWY4NTJkZDk0NzQyYzMwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNzMxNjZlYmI3OWI0ZTM4ODg3MTBhNDYxZTI4YzNhOC5iaW5kUG9wdXAocG9wdXBfMGI5ZWZmZTMzYjQ1NGM0NmJhZmFmNjA0ZTE5ZWJhODQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNhMzk0ODM5ZGMyNDJiNDhiZjQyOWJmMzNiY2JmNDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3MDlhZTg1NDNjODRiZTQ4MWEwNDc5ZTVhODlkZWM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwODhkYTdmMjhhYzRmYjVhYzQ1Njc3NDRkODdjYzU0ID0gJCgnPGRpdiBpZD0iaHRtbF9iMDg4ZGE3ZjI4YWM0ZmI1YWM0NTY3NzQ0ZDg3Y2M1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3MDlhZTg1NDNjODRiZTQ4MWEwNDc5ZTVhODlkZWM5LnNldENvbnRlbnQoaHRtbF9iMDg4ZGE3ZjI4YWM0ZmI1YWM0NTY3NzQ0ZDg3Y2M1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yY2EzOTQ4MzlkYzI0MmI0OGJmNDI5YmYzM2JjYmY0Ni5iaW5kUG9wdXAocG9wdXBfMDcwOWFlODU0M2M4NGJlNDgxYTA0NzllNWE4OWRlYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNjNTJiYzNiMmIyNDY0MzliMGQ4MDc4YTA3YWI3ODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjY4NDQ3OTNhNDU0NTZiOGUxMDYwNDRkNWNjMjBjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzg0YmQ3NzViZTk0Zjc2YWZlYzcwNTJhNGI1NGQ5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDc4NGJkNzc1YmU5NGY3NmFmZWM3MDUyYTRiNTRkOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDY2ODQ0NzkzYTQ1NDU2YjhlMTA2MDQ0ZDVjYzIwY2Yuc2V0Q29udGVudChodG1sX2Q3ODRiZDc3NWJlOTRmNzZhZmVjNzA1MmE0YjU0ZDkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUzYzUyYmMzYjJiMjQ2NDM5YjBkODA3OGEwN2FiNzgxLmJpbmRQb3B1cChwb3B1cF80NjY4NDQ3OTNhNDU0NTZiOGUxMDYwNDRkNWNjMjBjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZTBkNmU4ODA2ZGY0NDIxYWZjZTYyMjQzNjg2MmE4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOTZhMjFmMzZjMjM0ZGFmOTZjZWM0OTBlMTcyYjMxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTg1MjgxMThlZGU0ZjJkOTE2MDZkYzhjNDk1YmRlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmU4NTI4MTE4ZWRlNGYyZDkxNjA2ZGM4YzQ5NWJkZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTk2YTIxZjM2YzIzNGRhZjk2Y2VjNDkwZTE3MmIzMTYuc2V0Q29udGVudChodG1sXzJlODUyODExOGVkZTRmMmQ5MTYwNmRjOGM0OTViZGUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlMGQ2ZTg4MDZkZjQ0MjFhZmNlNjIyNDM2ODYyYTg4LmJpbmRQb3B1cChwb3B1cF9hOTZhMjFmMzZjMjM0ZGFmOTZjZWM0OTBlMTcyYjMxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xY2ViN2I4ZTU3ZWM0MjUzYTliZTUxNDZlZmU2NDFjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTdmYjI1MDI5NDg4NGEyYWJiNDZjMWI5ZDM4NzBmYzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmRjNWM1MDMwNjA4NDdlZmI3MjVhYWM0YTEwMWUyMzkgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkYzVjNTAzMDYwODQ3ZWZiNzI1YWFjNGExMDFlMjM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdmYjI1MDI5NDg4NGEyYWJiNDZjMWI5ZDM4NzBmYzMuc2V0Q29udGVudChodG1sX2ZkYzVjNTAzMDYwODQ3ZWZiNzI1YWFjNGExMDFlMjM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjZWI3YjhlNTdlYzQyNTNhOWJlNTE0NmVmZTY0MWNiLmJpbmRQb3B1cChwb3B1cF8xN2ZiMjUwMjk0ODg0YTJhYmI0NmMxYjlkMzg3MGZjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODg1NmVmZGU5ZGI0NWY2OTVlNWFmMjQzNWNmMDBlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMWRkMDY0NjkyNWM0YzBmYjljNWZjODZmNWQ5NmQ3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZDZmMjE1MThhMmM0MGMzYmJiYjNjYjkyMmRhZDE3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWQ2ZjIxNTE4YTJjNDBjM2JiYmIzY2I5MjJkYWQxN2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExZGQwNjQ2OTI1YzRjMGZiOWM1ZmM4NmY1ZDk2ZDcwLnNldENvbnRlbnQoaHRtbF9hZDZmMjE1MThhMmM0MGMzYmJiYjNjYjkyMmRhZDE3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODg1NmVmZGU5ZGI0NWY2OTVlNWFmMjQzNWNmMDBlNS5iaW5kUG9wdXAocG9wdXBfYTFkZDA2NDY5MjVjNGMwZmI5YzVmYzg2ZjVkOTZkNzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDc4Nzg1ZGJmNDg0NGRlMGEwZTZkYTAyNmI5NzNmMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDE5ZmZjODY2ZjYwNDE1NWE0YjQxZDI2ZjgzMWFkODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQzZmRlMzk5MzEzNDhhYmJlYTM0Yzk3OTc0YWJiMDAgPSAkKCc8ZGl2IGlkPSJodG1sX2E0M2ZkZTM5OTMxMzQ4YWJiZWEzNGM5Nzk3NGFiYjAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxOWZmYzg2NmY2MDQxNTVhNGI0MWQyNmY4MzFhZDgzLnNldENvbnRlbnQoaHRtbF9hNDNmZGUzOTkzMTM0OGFiYmVhMzRjOTc5NzRhYmIwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNzg3ODVkYmY0ODQ0ZGUwYTBlNmRhMDI2Yjk3M2YxNS5iaW5kUG9wdXAocG9wdXBfZDE5ZmZjODY2ZjYwNDE1NWE0YjQxZDI2ZjgzMWFkODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM5ODc2MWY1ZDgxNGI1YThjMTc5YWQxZjNkNDM1MzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjg0MmQ3NjVhOGNjNGY0YjliYzdkMDcwNTQ0NmNhMjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjIwMDllMjU0YzZhNDcxNWFjYmMyYmE3YzZkMTgyODkgPSAkKCc8ZGl2IGlkPSJodG1sX2YyMDA5ZTI1NGM2YTQ3MTVhY2JjMmJhN2M2ZDE4Mjg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4NDJkNzY1YThjYzRmNGI5YmM3ZDA3MDU0NDZjYTIwLnNldENvbnRlbnQoaHRtbF9mMjAwOWUyNTRjNmE0NzE1YWNiYzJiYTdjNmQxODI4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYzk4NzYxZjVkODE0YjVhOGMxNzlhZDFmM2Q0MzUzOS5iaW5kUG9wdXAocG9wdXBfZjg0MmQ3NjVhOGNjNGY0YjliYzdkMDcwNTQ0NmNhMjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDVmYmQ0MDUzNDhmNDFmMWJjNWY1OTFmNTA0MjYzZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0ZTdjNzFlMDhlOTQxZjg5YTJiM2M0ZDQ5MDM4MTM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0M2MzZGY3MDAyMjRhN2E5OTQ3ZjQ5YmJjZGIyZGYyID0gJCgnPGRpdiBpZD0iaHRtbF8yNDNjM2RmNzAwMjI0YTdhOTk0N2Y0OWJiY2RiMmRmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzRlN2M3MWUwOGU5NDFmODlhMmIzYzRkNDkwMzgxMzYuc2V0Q29udGVudChodG1sXzI0M2MzZGY3MDAyMjRhN2E5OTQ3ZjQ5YmJjZGIyZGYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1ZmJkNDA1MzQ4ZjQxZjFiYzVmNTkxZjUwNDI2M2QyLmJpbmRQb3B1cChwb3B1cF8zNGU3YzcxZTA4ZTk0MWY4OWEyYjNjNGQ0OTAzODEzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNGRjZDJlYWNmY2U0YzBlYWEwZDc3MTJiZmFiZWFjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QyMDc3MTU2YjcwNGNjMDhkZjljOWE1OTI2YjY4ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTI4MmFkMzliNGQyNGNkYmJiOGZkYmY1N2NmOTQwNTAgPSAkKCc8ZGl2IGlkPSJodG1sXzUyODJhZDM5YjRkMjRjZGJiYjhmZGJmNTdjZjk0MDUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkMjA3NzE1NmI3MDRjYzA4ZGY5YzlhNTkyNmI2ODg4LnNldENvbnRlbnQoaHRtbF81MjgyYWQzOWI0ZDI0Y2RiYmI4ZmRiZjU3Y2Y5NDA1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNGRjZDJlYWNmY2U0YzBlYWEwZDc3MTJiZmFiZWFjOS5iaW5kUG9wdXAocG9wdXBfY2QyMDc3MTU2YjcwNGNjMDhkZjljOWE1OTI2YjY4ODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2Y5YjVkNjlkODU1NDkyMDg1NDZhYTAzMzI1ZjNiZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmI4OTIzYzY3MDc0NDhiOGI1MGI1ZjdmYzM3NDY3MzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzAxNmZmYjBlOGQ0NDU0Y2EwMjJjM2Q4MDE3MzliODUgPSAkKCc8ZGl2IGlkPSJodG1sXzMwMTZmZmIwZThkNDQ1NGNhMDIyYzNkODAxNzM5Yjg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYjg5MjNjNjcwNzQ0OGI4YjUwYjVmN2ZjMzc0NjczMC5zZXRDb250ZW50KGh0bWxfMzAxNmZmYjBlOGQ0NDU0Y2EwMjJjM2Q4MDE3MzliODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2Y5YjVkNjlkODU1NDkyMDg1NDZhYTAzMzI1ZjNiZGMuYmluZFBvcHVwKHBvcHVwX2JiODkyM2M2NzA3NDQ4YjhiNTBiNWY3ZmMzNzQ2NzMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyMThmZWVlYTUxMjRmZGFiMDY4ZDQ4MmE0OWU3ZDkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZTg2YjFlN2FhYWU0NzBmODQ3MzVjMTA3N2Y1NWExMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NzI2NmZlNWZjMTI0NzFhODEzMmRlZjYwNDI4ZjY2MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjcyNjZmZTVmYzEyNDcxYTgxMzJkZWY2MDQyOGY2NjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZTg2YjFlN2FhYWU0NzBmODQ3MzVjMTA3N2Y1NWExMi5zZXRDb250ZW50KGh0bWxfNjcyNjZmZTVmYzEyNDcxYTgxMzJkZWY2MDQyOGY2NjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzIxOGZlZWVhNTEyNGZkYWIwNjhkNDgyYTQ5ZTdkOTEuYmluZFBvcHVwKHBvcHVwX2NlODZiMWU3YWFhZTQ3MGY4NDczNWMxMDc3ZjU1YTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkNjk0NGI5NDg2OTRmNWM5M2I1YTMxNDhjNTk0ZWI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlOTVlYmY3ZDg2YzQzNmE4NjZlMjllYTk2NjE4NmY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0NjI5NGZhZjNlMTRlZWY5ZTc4Yjc0ODhkYWE2NWIyID0gJCgnPGRpdiBpZD0iaHRtbF9kNDYyOTRmYWYzZTE0ZWVmOWU3OGI3NDg4ZGFhNjViMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlOTVlYmY3ZDg2YzQzNmE4NjZlMjllYTk2NjE4NmY2LnNldENvbnRlbnQoaHRtbF9kNDYyOTRmYWYzZTE0ZWVmOWU3OGI3NDg4ZGFhNjViMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZDY5NDRiOTQ4Njk0ZjVjOTNiNWEzMTQ4YzU5NGViNy5iaW5kUG9wdXAocG9wdXBfN2U5NWViZjdkODZjNDM2YTg2NmUyOWVhOTY2MTg2ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDQyMDM2ZjRkMDY1NGM4YmExYTIwNjAyZDFlNjEzZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2MWU1MWQwYzE2YzQ5ZmZiNjZkMGI0ODA3YThiZjZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0NTE1MmY1MzBmNjRkMWJhNGYxODk3OWEzZTJiY2JjID0gJCgnPGRpdiBpZD0iaHRtbF83NDUxNTJmNTMwZjY0ZDFiYTRmMTg5NzlhM2UyYmNiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNjFlNTFkMGMxNmM0OWZmYjY2ZDBiNDgwN2E4YmY2Zi5zZXRDb250ZW50KGh0bWxfNzQ1MTUyZjUzMGY2NGQxYmE0ZjE4OTc5YTNlMmJjYmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDQyMDM2ZjRkMDY1NGM4YmExYTIwNjAyZDFlNjEzZGYuYmluZFBvcHVwKHBvcHVwX2Q2MWU1MWQwYzE2YzQ5ZmZiNjZkMGI0ODA3YThiZjZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5NzcwNDE3N2M3NjQ3ZGJiYzVhY2FjMmQwMjk3YWFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiZDRmZGM5NzRkZjQ3ZmFhZDc4NzRjMjAwM2M1MGM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjZWVkN2NlMmFiZTQwMTdhOWViNDQ3OWVlZmVlNTYyID0gJCgnPGRpdiBpZD0iaHRtbF8zY2VlZDdjZTJhYmU0MDE3YTllYjQ0NzllZWZlZTU2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiZDRmZGM5NzRkZjQ3ZmFhZDc4NzRjMjAwM2M1MGM0LnNldENvbnRlbnQoaHRtbF8zY2VlZDdjZTJhYmU0MDE3YTllYjQ0NzllZWZlZTU2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOTc3MDQxNzdjNzY0N2RiYmM1YWNhYzJkMDI5N2FhZS5iaW5kUG9wdXAocG9wdXBfY2JkNGZkYzk3NGRmNDdmYWFkNzg3NGMyMDAzYzUwYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjU1OWFjZTVlMDE2NDNjMTlkOWFlODEwNTEyNTZhMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRmMGQ2Njg1YWJmNDYzYjlmZDBlM2YzNmQxZTJjMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjkyYTYwMzk5OGYwNDg1ZWI0OWRjNTVhYjVkYWM4ZWUgPSAkKCc8ZGl2IGlkPSJodG1sXzI5MmE2MDM5OThmMDQ4NWViNDlkYzU1YWI1ZGFjOGVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkZjBkNjY4NWFiZjQ2M2I5ZmQwZTNmMzZkMWUyYzM0LnNldENvbnRlbnQoaHRtbF8yOTJhNjAzOTk4ZjA0ODVlYjQ5ZGM1NWFiNWRhYzhlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNTU5YWNlNWUwMTY0M2MxOWQ5YWU4MTA1MTI1NmEyYi5iaW5kUG9wdXAocG9wdXBfMmRmMGQ2Njg1YWJmNDYzYjlmZDBlM2YzNmQxZTJjMzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmIxMDhiZmJkMTg2NDBlZDlhYzgzY2ZjZTQ1ZDI4MWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RlNjk3N2U4MjRjNDY0Zjk5YzRkMjM5OGQ0NGUyODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQ3MDBiMjZjNjYzNGE5OTk4M2NkZTFkMDY2ZjcxYjQgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0NzAwYjI2YzY2MzRhOTk5ODNjZGUxZDA2NmY3MWI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2RlNjk3N2U4MjRjNDY0Zjk5YzRkMjM5OGQ0NGUyODEuc2V0Q29udGVudChodG1sX2Y0NzAwYjI2YzY2MzRhOTk5ODNjZGUxZDA2NmY3MWI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiMTA4YmZiZDE4NjQwZWQ5YWM4M2NmY2U0NWQyODFjLmJpbmRQb3B1cChwb3B1cF9jZGU2OTc3ZTgyNGM0NjRmOTljNGQyMzk4ZDQ0ZTI4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZWE0ZTkxYzBiOGI0Mzc1YmVkZjZkMzZhODhkNWJhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGM4MTk2YzAzMjVlNDJiMDgwOTUyOGI2MzY3NTE2NTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2U5OTk4MGI5OTEwNGZiOGEwMzMyNTEwOWYwMGJhM2UgPSAkKCc8ZGl2IGlkPSJodG1sX2NlOTk5ODBiOTkxMDRmYjhhMDMzMjUxMDlmMDBiYTNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjODE5NmMwMzI1ZTQyYjA4MDk1MjhiNjM2NzUxNjU4LnNldENvbnRlbnQoaHRtbF9jZTk5OTgwYjk5MTA0ZmI4YTAzMzI1MTA5ZjAwYmEzZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZWE0ZTkxYzBiOGI0Mzc1YmVkZjZkMzZhODhkNWJhOC5iaW5kUG9wdXAocG9wdXBfOGM4MTk2YzAzMjVlNDJiMDgwOTUyOGI2MzY3NTE2NTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmUzMGFhZjE3YTEwNGY2Mjg0OTViYzRhNDQ0YzIwMGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU4NzU0MjRmN2MwNzQzZWI4NDdiZDg2MzA0YWQ4YTI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3N2M3YzNjYWVlMjQ0ZGVhZTcxNzUyNWNkZjFkMDc1ID0gJCgnPGRpdiBpZD0iaHRtbF83NzdjN2MzY2FlZTI0NGRlYWU3MTc1MjVjZGYxZDA3NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODc1NDI0ZjdjMDc0M2ViODQ3YmQ4NjMwNGFkOGEyNi5zZXRDb250ZW50KGh0bWxfNzc3YzdjM2NhZWUyNDRkZWFlNzE3NTI1Y2RmMWQwNzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmUzMGFhZjE3YTEwNGY2Mjg0OTViYzRhNDQ0YzIwMGEuYmluZFBvcHVwKHBvcHVwXzU4NzU0MjRmN2MwNzQzZWI4NDdiZDg2MzA0YWQ4YTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzNmJhODI4Y2U1ZDQ0ZWU4ZDE4NmMzYzQ4NzYxYWJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOTE3ZjM5MTIzNTk0MGYwYmE3ZTE3YzAwZGE2NzMyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZGYwMmU3Y2VmNjQ0ODJhYTAzODBlYzE4OGE1Y2NlYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWRmMDJlN2NlZjY0NDgyYWEwMzgwZWMxODhhNWNjZWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI5MTdmMzkxMjM1OTQwZjBiYTdlMTdjMDBkYTY3MzIwLnNldENvbnRlbnQoaHRtbF81ZGYwMmU3Y2VmNjQ0ODJhYTAzODBlYzE4OGE1Y2NlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzZiYTgyOGNlNWQ0NGVlOGQxODZjM2M0ODc2MWFiYS5iaW5kUG9wdXAocG9wdXBfMjkxN2YzOTEyMzU5NDBmMGJhN2UxN2MwMGRhNjczMjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjU4OGI2NmEzY2U1NGE2OTliOTkwNGRiOGM2ZWNmODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDBlYTFiYWNhY2VmNGEzOGE3OTk4MGEyNDdhNTdjMDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ4NTUzOGI5MGEyNDFlMGFjMDIxMDRiZTQ4YTVjNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzFkODU1MzhiOTBhMjQxZTBhYzAyMTA0YmU0OGE1YzY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGVhMWJhY2FjZWY0YTM4YTc5OTgwYTI0N2E1N2MwMy5zZXRDb250ZW50KGh0bWxfMWQ4NTUzOGI5MGEyNDFlMGFjMDIxMDRiZTQ4YTVjNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjU4OGI2NmEzY2U1NGE2OTliOTkwNGRiOGM2ZWNmODMuYmluZFBvcHVwKHBvcHVwXzAwZWExYmFjYWNlZjRhMzhhNzk5ODBhMjQ3YTU3YzAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiYmNmNmMzODRmMjQwNzlhMjI2OWFiMDE2MzhiZjk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWNkOGQwNjMxNTdlNGE4YzliNWNhN2IwYjUzNzU0NDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQ4MGQ3YmE1NGM2NDMyMWJhYmJjYjNmN2QyNjRmNmEgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0ODBkN2JhNTRjNjQzMjFiYWJiY2IzZjdkMjY0ZjZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWNkOGQwNjMxNTdlNGE4YzliNWNhN2IwYjUzNzU0NDkuc2V0Q29udGVudChodG1sX2Q0ODBkN2JhNTRjNjQzMjFiYWJiY2IzZjdkMjY0ZjZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiYmNmNmMzODRmMjQwNzlhMjI2OWFiMDE2MzhiZjk1LmJpbmRQb3B1cChwb3B1cF9hY2Q4ZDA2MzE1N2U0YThjOWI1Y2E3YjBiNTM3NTQ0OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTdkMDgzYmNmYjU0YTA0OWFmZjA2NTlkOTNjMDY1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNWI4ZTg2NzdkMjg0ZGI4ODM4YzBmODRhNDlhODc4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMWZhNTM2NTYzOWQ0N2Y4YTY1OGI2NDMwNTVhZTAwMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDFmYTUzNjU2MzlkNDdmOGE2NThiNjQzMDU1YWUwMDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTViOGU4Njc3ZDI4NGRiODgzOGMwZjg0YTQ5YTg3ODMuc2V0Q29udGVudChodG1sXzAxZmE1MzY1NjM5ZDQ3ZjhhNjU4YjY0MzA1NWFlMDAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5N2QwODNiY2ZiNTRhMDQ5YWZmMDY1OWQ5M2MwNjViLmJpbmRQb3B1cChwb3B1cF9lNWI4ZTg2NzdkMjg0ZGI4ODM4YzBmODRhNDlhODc4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lOGU4MmVmNGUxNmU0ZjBlOTdiMjZhOTdlNTBmZTYxMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTM3M2JhOGU5YTA0OWNhOWZiNzg2YWVlZWQ1ZTgxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zN2I4ZTM0Y2ViZTY0ZmQ0OGY2ODE4Y2VmZTEwMDljMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzdiOGUzNGNlYmU2NGZkNDhmNjgxOGNlZmUxMDA5YzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllMzczYmE4ZTlhMDQ5Y2E5ZmI3ODZhZWVlZDVlODE2LnNldENvbnRlbnQoaHRtbF8zN2I4ZTM0Y2ViZTY0ZmQ0OGY2ODE4Y2VmZTEwMDljMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOGU4MmVmNGUxNmU0ZjBlOTdiMjZhOTdlNTBmZTYxMy5iaW5kUG9wdXAocG9wdXBfOWUzNzNiYThlOWEwNDljYTlmYjc4NmFlZWVkNWU4MTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDVjNTA3YzRkYjFjNDljZDk2ZTE1MGVkZGQxMzYyMWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzEwODhmM2FiZTgxNGM3M2E5MTUzMWVlMDQzNDhlZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmIwYzkxYmRmNGZiNGY2ZWJiYTg4NmMyZmVjNGY5MTQgPSAkKCc8ZGl2IGlkPSJodG1sX2JiMGM5MWJkZjRmYjRmNmViYmE4ODZjMmZlYzRmOTE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzEwODhmM2FiZTgxNGM3M2E5MTUzMWVlMDQzNDhlZGYuc2V0Q29udGVudChodG1sX2JiMGM5MWJkZjRmYjRmNmViYmE4ODZjMmZlYzRmOTE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1YzUwN2M0ZGIxYzQ5Y2Q5NmUxNTBlZGRkMTM2MjFhLmJpbmRQb3B1cChwb3B1cF8zMTA4OGYzYWJlODE0YzczYTkxNTMxZWUwNDM0OGVkZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZDZkYzdkZWQ2OWU0NjJkODQyNTg4YmEzZjQ2MDc1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg2MmJkYjM5YzUzNDgzNWEzZjdhZDU4ZjRiYjY0YjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWI2YjY3M2E3MzdjNGY0Njk3ODMzYTU2MGNiNjdiMmYgPSAkKCc8ZGl2IGlkPSJodG1sX2ViNmI2NzNhNzM3YzRmNDY5NzgzM2E1NjBjYjY3YjJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kODYyYmRiMzljNTM0ODM1YTNmN2FkNThmNGJiNjRiNi5zZXRDb250ZW50KGh0bWxfZWI2YjY3M2E3MzdjNGY0Njk3ODMzYTU2MGNiNjdiMmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmQ2ZGM3ZGVkNjllNDYyZDg0MjU4OGJhM2Y0NjA3NWEuYmluZFBvcHVwKHBvcHVwX2Q4NjJiZGIzOWM1MzQ4MzVhM2Y3YWQ1OGY0YmI2NGI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2NWM2NTFjNTVkMjQzMWE4MjMyNTQyN2VhN2U4OGRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzhhMzk1YmI2M2YxNDhiZTljNWY1OWZmZWQ1ZDcwZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQ5MTU0MzYyMmFhNDlmZmE2YzgxYmIzNGIyNzk5NzcgPSAkKCc8ZGl2IGlkPSJodG1sXzY0OTE1NDM2MjJhYTQ5ZmZhNmM4MWJiMzRiMjc5OTc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzhhMzk1YmI2M2YxNDhiZTljNWY1OWZmZWQ1ZDcwZWMuc2V0Q29udGVudChodG1sXzY0OTE1NDM2MjJhYTQ5ZmZhNmM4MWJiMzRiMjc5OTc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ2NWM2NTFjNTVkMjQzMWE4MjMyNTQyN2VhN2U4OGRlLmJpbmRQb3B1cChwb3B1cF83OGEzOTViYjYzZjE0OGJlOWM1ZjU5ZmZlZDVkNzBlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODlmOGJlY2U3NmE0NjdkOTU1MWE1YzVhZDAyNDdmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNzRjYWJmZWY1ZGQ0NDRmYTk4ZDlhOWNhYzkyZDE0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjk4YjE3MjYzNDE0ODkzOWI2ZDEzMTEwYjY5NmY5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTY5OGIxNzI2MzQxNDg5MzliNmQxMzExMGI2OTZmOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzRjYWJmZWY1ZGQ0NDRmYTk4ZDlhOWNhYzkyZDE0Ni5zZXRDb250ZW50KGh0bWxfMTY5OGIxNzI2MzQxNDg5MzliNmQxMzExMGI2OTZmOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTg5ZjhiZWNlNzZhNDY3ZDk1NTFhNWM1YWQwMjQ3ZjUuYmluZFBvcHVwKHBvcHVwX2I3NGNhYmZlZjVkZDQ0NGZhOThkOWE5Y2FjOTJkMTQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwZmNjOTA2MTU2MDQzNTZiZTUwYmI0MWQzMTdhYmVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyN2EyNzI4NmQwZjQzY2U4YTRiYWM5NGFlN2JkN2IzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3NTNjMmZjYzYzNDQ4MDE4ZTMyZDAxOWVmYzllYTkxID0gJCgnPGRpdiBpZD0iaHRtbF83NzUzYzJmY2M2MzQ0ODAxOGUzMmQwMTllZmM5ZWE5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YyN2EyNzI4NmQwZjQzY2U4YTRiYWM5NGFlN2JkN2IzLnNldENvbnRlbnQoaHRtbF83NzUzYzJmY2M2MzQ0ODAxOGUzMmQwMTllZmM5ZWE5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MGZjYzkwNjE1NjA0MzU2YmU1MGJiNDFkMzE3YWJlYS5iaW5kUG9wdXAocG9wdXBfZjI3YTI3Mjg2ZDBmNDNjZThhNGJhYzk0YWU3YmQ3YjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjg2ODc0YjcwNDI1NDNlNjg3ZWFhMzJhZTQyMGNiM2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYTAwNjc2ODdlODA0ODQ1YWQ4NWNmNjE5YTU0ODBlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZGM2NTE2YTcxYTk0NGVkYTZkZjM1MjlkMWJhZGRlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmRjNjUxNmE3MWE5NDRlZGE2ZGYzNTI5ZDFiYWRkZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhMDA2NzY4N2U4MDQ4NDVhZDg1Y2Y2MTlhNTQ4MGU1LnNldENvbnRlbnQoaHRtbF9mZGM2NTE2YTcxYTk0NGVkYTZkZjM1MjlkMWJhZGRlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODY4NzRiNzA0MjU0M2U2ODdlYWEzMmFlNDIwY2IzZC5iaW5kUG9wdXAocG9wdXBfMGEwMDY3Njg3ZTgwNDg0NWFkODVjZjYxOWE1NDgwZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmNlYTA4YzlmMWM3NGE3MTk2MzRhMTRkMTlhN2VkNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTMzODMxMDE3NDVjNGMyMTgxZDEzYzVhYjJlZTJiZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzY4NTExNTNkY2YyNGVlNmJhZWMyMDY5Njk5OGNiMzAgPSAkKCc8ZGl2IGlkPSJodG1sX2M2ODUxMTUzZGNmMjRlZTZiYWVjMjA2OTY5OThjYjMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzMzgzMTAxNzQ1YzRjMjE4MWQxM2M1YWIyZWUyYmQ1LnNldENvbnRlbnQoaHRtbF9jNjg1MTE1M2RjZjI0ZWU2YmFlYzIwNjk2OTk4Y2IzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Y2VhMDhjOWYxYzc0YTcxOTYzNGExNGQxOWE3ZWQ1Yy5iaW5kUG9wdXAocG9wdXBfZTMzODMxMDE3NDVjNGMyMTgxZDEzYzVhYjJlZTJiZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzYwZWJhYjJhYzZmNDU1Zjk5NGNlOThkMDRjOTgyYjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDFmZTQwNWU5M2ZmNDA4Yjk5Y2NjM2Y4ODM3ZTZhNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjExNTFlY2VmNDA2NGRjZWIzMDliNjgyZjU3MjEzMGIgPSAkKCc8ZGl2IGlkPSJodG1sX2IxMTUxZWNlZjQwNjRkY2ViMzA5YjY4MmY1NzIxMzBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMWZlNDA1ZTkzZmY0MDhiOTljY2MzZjg4MzdlNmE2OS5zZXRDb250ZW50KGh0bWxfYjExNTFlY2VmNDA2NGRjZWIzMDliNjgyZjU3MjEzMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzYwZWJhYjJhYzZmNDU1Zjk5NGNlOThkMDRjOTgyYjguYmluZFBvcHVwKHBvcHVwXzAxZmU0MDVlOTNmZjQwOGI5OWNjYzNmODgzN2U2YTY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkZGRlNmMzMjcwOTRjN2U5ZjIyNGViNTA2ZGNjOTI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3MmExYTg5Y2RkYzRlM2Q4Nzg4OWJkMThlOTUxOWRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyOTgxOTZlNWZjNTQ0M2M4OWVlMTY3ZTc0ZmU0YTBhID0gJCgnPGRpdiBpZD0iaHRtbF9lMjk4MTk2ZTVmYzU0NDNjODllZTE2N2U3NGZlNGEwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzJhMWE4OWNkZGM0ZTNkODc4ODliZDE4ZTk1MTlkYS5zZXRDb250ZW50KGh0bWxfZTI5ODE5NmU1ZmM1NDQzYzg5ZWUxNjdlNzRmZTRhMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmRkZGU2YzMyNzA5NGM3ZTlmMjI0ZWI1MDZkY2M5MjguYmluZFBvcHVwKHBvcHVwXzI3MmExYTg5Y2RkYzRlM2Q4Nzg4OWJkMThlOTUxOWRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiODg3Y2VhNzlhYjQwMjM4NGUwZjhkNmI0OWMzNjhmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMWEwYzFjZmEwMTRjNDY5MzkzODFhOWUxMzNmOTYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwYjZjZjM3MmZiNzQzZTVhZGZmYTQ2OTM1NzM3ZDE3ID0gJCgnPGRpdiBpZD0iaHRtbF9jMGI2Y2YzNzJmYjc0M2U1YWRmZmE0NjkzNTczN2QxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmMWEwYzFjZmEwMTRjNDY5MzkzODFhOWUxMzNmOTYxLnNldENvbnRlbnQoaHRtbF9jMGI2Y2YzNzJmYjc0M2U1YWRmZmE0NjkzNTczN2QxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYjg4N2NlYTc5YWI0MDIzODRlMGY4ZDZiNDljMzY4Zi5iaW5kUG9wdXAocG9wdXBfOGYxYTBjMWNmYTAxNGM0NjkzOTM4MWE5ZTEzM2Y5NjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzc1OTBkMDE4NWZkNDE1YmJkZDA4NTUzNDk1MDc1MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTU5NjAwNmVlYzU1NGM4MWI2NTVhY2FkN2M4YjhiOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTU4NDRhZGQzNjE0NDhlNjhiMDc0NzhhNTA1M2RkNGMgPSAkKCc8ZGl2IGlkPSJodG1sX2U1ODQ0YWRkMzYxNDQ4ZTY4YjA3NDc4YTUwNTNkZDRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1OTYwMDZlZWM1NTRjODFiNjU1YWNhZDdjOGI4YjljLnNldENvbnRlbnQoaHRtbF9lNTg0NGFkZDM2MTQ0OGU2OGIwNzQ3OGE1MDUzZGQ0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzU5MGQwMTg1ZmQ0MTViYmRkMDg1NTM0OTUwNzUxNC5iaW5kUG9wdXAocG9wdXBfYTU5NjAwNmVlYzU1NGM4MWI2NTVhY2FkN2M4YjhiOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGYxZTkwODFmZmI4NGVmZGFiMTkxNDc3ZWRmMjdjNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkYTkyMzVmMTNkYzRmMTFhNWVlNTM0MjQxZGU4NDE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I3MzAxZGE1MDQ1NjQ4ZTQ4OTFlMjFhYjg4NWFkZjhjID0gJCgnPGRpdiBpZD0iaHRtbF9iNzMwMWRhNTA0NTY0OGU0ODkxZTIxYWI4ODVhZGY4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZGE5MjM1ZjEzZGM0ZjExYTVlZTUzNDI0MWRlODQxOC5zZXRDb250ZW50KGh0bWxfYjczMDFkYTUwNDU2NDhlNDg5MWUyMWFiODg1YWRmOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGYxZTkwODFmZmI4NGVmZGFiMTkxNDc3ZWRmMjdjNzEuYmluZFBvcHVwKHBvcHVwXzhkYTkyMzVmMTNkYzRmMTFhNWVlNTM0MjQxZGU4NDE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwOTU2NjQ5NzUwMDQxMjFiNWMzNjZiODNkNzlkZjllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiOTk1YWRiNzhkYjQyOWY4Mzk2NWI1OTNlYjY1YmRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhMWI4MGI5N2QwODRkNDViZTIyMmIyZGY0NDVkYTEyID0gJCgnPGRpdiBpZD0iaHRtbF84YTFiODBiOTdkMDg0ZDQ1YmUyMjJiMmRmNDQ1ZGExMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiOTk1YWRiNzhkYjQyOWY4Mzk2NWI1OTNlYjY1YmRjLnNldENvbnRlbnQoaHRtbF84YTFiODBiOTdkMDg0ZDQ1YmUyMjJiMmRmNDQ1ZGExMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MDk1NjY0OTc1MDA0MTIxYjVjMzY2YjgzZDc5ZGY5ZS5iaW5kUG9wdXAocG9wdXBfYmI5OTVhZGI3OGRiNDI5ZjgzOTY1YjU5M2ViNjViZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTFhYzhmNGIyYTk5NDA5MjhmOTllOWM1ODIzN2IxNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDEzYTJkMzhjMTA4NDRmNzk4OTFmMDdhMDMwOTk4YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQwNTNlY2JkZDdhNDM2NGFlNWY1ZmMzNDQ1Zjc4OGUgPSAkKCc8ZGl2IGlkPSJodG1sXzM0MDUzZWNiZGQ3YTQzNjRhZTVmNWZjMzQ0NWY3ODhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTNhMmQzOGMxMDg0NGY3OTg5MWYwN2EwMzA5OThhZS5zZXRDb250ZW50KGh0bWxfMzQwNTNlY2JkZDdhNDM2NGFlNWY1ZmMzNDQ1Zjc4OGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTFhYzhmNGIyYTk5NDA5MjhmOTllOWM1ODIzN2IxNmQuYmluZFBvcHVwKHBvcHVwXzQxM2EyZDM4YzEwODQ0Zjc5ODkxZjA3YTAzMDk5OGFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiNmFmNmJiZjM1NjRmZWRiMWEzZDViYzljYjU4YjE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTdiZWE5OGY0NTJlNDAyMGE3YWQ0MjAwOGZhNTA5MDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTI0OGIwNjIwZTUzNDIxZDlhMjc3NTZmZjU1MzgxYjggPSAkKCc8ZGl2IGlkPSJodG1sXzkyNDhiMDYyMGU1MzQyMWQ5YTI3NzU2ZmY1NTM4MWI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTdiZWE5OGY0NTJlNDAyMGE3YWQ0MjAwOGZhNTA5MDcuc2V0Q29udGVudChodG1sXzkyNDhiMDYyMGU1MzQyMWQ5YTI3NzU2ZmY1NTM4MWI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiNmFmNmJiZjM1NjRmZWRiMWEzZDViYzljYjU4YjE1LmJpbmRQb3B1cChwb3B1cF9lN2JlYTk4ZjQ1MmU0MDIwYTdhZDQyMDA4ZmE1MDkwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDY5NGY2NTk1N2Y0YjExYjA3ZDI0MTU5NzZiYmNiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1ZGFjYWU1ZGMzZjQwZjZiYzg3NzBmYjcxMmIzOWQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1NmMyYTViMzMxYTQzODhiZDBjY2IyODgwZTU4YmQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9iNTZjMmE1YjMzMWE0Mzg4YmQwY2NiMjg4MGU1OGJkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1ZGFjYWU1ZGMzZjQwZjZiYzg3NzBmYjcxMmIzOWQ1LnNldENvbnRlbnQoaHRtbF9iNTZjMmE1YjMzMWE0Mzg4YmQwY2NiMjg4MGU1OGJkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNDY5NGY2NTk1N2Y0YjExYjA3ZDI0MTU5NzZiYmNiYy5iaW5kUG9wdXAocG9wdXBfZjVkYWNhZTVkYzNmNDBmNmJjODc3MGZiNzEyYjM5ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNmODc0YTc5MTI1NDBhMWE0ZWM5YTA0YWYxM2E0MzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0YTgyMDdjMTk4ZjQ2ZDlhYzY0YTg5Y2RkNDljMmE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4YWJjY2Q4ZDdkYzQyMjE5OTMzNWNmMTg4MmZmNzVkID0gJCgnPGRpdiBpZD0iaHRtbF80OGFiY2NkOGQ3ZGM0MjIxOTkzMzVjZjE4ODJmZjc1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNGE4MjA3YzE5OGY0NmQ5YWM2NGE4OWNkZDQ5YzJhNi5zZXRDb250ZW50KGh0bWxfNDhhYmNjZDhkN2RjNDIyMTk5MzM1Y2YxODgyZmY3NWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNmODc0YTc5MTI1NDBhMWE0ZWM5YTA0YWYxM2E0MzUuYmluZFBvcHVwKHBvcHVwX2E0YTgyMDdjMTk4ZjQ2ZDlhYzY0YTg5Y2RkNDljMmE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxZTA4NmI2ODAxNDRlZGE5OTlmZWMzYzdiODI2YzAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmNTg3ZTQ4ODEyNTRhZDE5M2U4YTE1ZjFjMWIyYzExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwNDEyZjY5ZTQ1MDQ5ZWZiYjE3NWQ2NzdjMWRhOWQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9iMDQxMmY2OWU0NTA0OWVmYmIxNzVkNjc3YzFkYTlkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZjU4N2U0ODgxMjU0YWQxOTNlOGExNWYxYzFiMmMxMS5zZXRDb250ZW50KGh0bWxfYjA0MTJmNjllNDUwNDllZmJiMTc1ZDY3N2MxZGE5ZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDFlMDg2YjY4MDE0NGVkYTk5OWZlYzNjN2I4MjZjMDIuYmluZFBvcHVwKHBvcHVwX2FmNTg3ZTQ4ODEyNTRhZDE5M2U4YTE1ZjFjMWIyYzExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwY2YxY2ZjYjBiZjQyNDY5ZmNjZGQ2YmM2OWU4ODAxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMDViNzcwYzQ0YWU0YzYwYTA2NzVkZDE0NjlhOGQzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZmJiOWVkNTY1YTg0YzBjYmQ0YTM4ODUwY2QzYTViYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWZiYjllZDU2NWE4NGMwY2JkNGEzODg1MGNkM2E1YmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDA1Yjc3MGM0NGFlNGM2MGEwNjc1ZGQxNDY5YThkMzIuc2V0Q29udGVudChodG1sXzVmYmI5ZWQ1NjVhODRjMGNiZDRhMzg4NTBjZDNhNWJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwY2YxY2ZjYjBiZjQyNDY5ZmNjZGQ2YmM2OWU4ODAxLmJpbmRQb3B1cChwb3B1cF8wMDViNzcwYzQ0YWU0YzYwYTA2NzVkZDE0NjlhOGQzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTI1MzEzOTM3MjY0NDEwYmQ3YjMxYTNiZmE0MjdkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNmY5OGE0MzIwN2I0MzQzOTBiNTNkZjczNjczMzA2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZmIyNjMyY2JjZjA0NmQwOWM0MGZiODQ2MTkyOGUzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmZiMjYzMmNiY2YwNDZkMDljNDBmYjg0NjE5MjhlMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZmOThhNDMyMDdiNDM0MzkwYjUzZGY3MzY3MzMwNmQuc2V0Q29udGVudChodG1sXzJmYjI2MzJjYmNmMDQ2ZDA5YzQwZmI4NDYxOTI4ZTM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxMjUzMTM5MzcyNjQ0MTBiZDdiMzFhM2JmYTQyN2RhLmJpbmRQb3B1cChwb3B1cF8zNmY5OGE0MzIwN2I0MzQzOTBiNTNkZjczNjczMzA2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjkyOGVlMmM1ZjU0NDUyYTUyNjM2NjE2ZjE1NjY0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3YTdjYzU3MTc4OTQ4OThhNDBkMDM0ZjA5YzY5YjVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzNjYyZjQwNjVmMjQ5Yjg5YTFmNWRlYWRhNmRjNzdmID0gJCgnPGRpdiBpZD0iaHRtbF85MzY2MmY0MDY1ZjI0OWI4OWExZjVkZWFkYTZkYzc3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82N2E3Y2M1NzE3ODk0ODk4YTQwZDAzNGYwOWM2OWI1Yy5zZXRDb250ZW50KGh0bWxfOTM2NjJmNDA2NWYyNDliODlhMWY1ZGVhZGE2ZGM3N2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjY5MjhlZTJjNWY1NDQ1MmE1MjYzNjYxNmYxNTY2NDQuYmluZFBvcHVwKHBvcHVwXzY3YTdjYzU3MTc4OTQ4OThhNDBkMDM0ZjA5YzY5YjVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk5ZjM4OGI1M2UzODQ4NTc4Y2QwZTUyZWI0ZmJhYTdlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhZjdmNjZkZmJiYTQyNGJiN2MxMDQyY2U4OWE3MjEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1MzY0MTkyNDNiNDQzOWM4ODhhMGM4NWRhZTljZmE1ID0gJCgnPGRpdiBpZD0iaHRtbF9mNTM2NDE5MjQzYjQ0MzljODg4YTBjODVkYWU5Y2ZhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYWY3ZjY2ZGZiYmE0MjRiYjdjMTA0MmNlODlhNzIxMC5zZXRDb250ZW50KGh0bWxfZjUzNjQxOTI0M2I0NDM5Yzg4OGEwYzg1ZGFlOWNmYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTlmMzg4YjUzZTM4NDg1NzhjZDBlNTJlYjRmYmFhN2UuYmluZFBvcHVwKHBvcHVwXzFhZjdmNjZkZmJiYTQyNGJiN2MxMDQyY2U4OWE3MjEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzODM1N2U0MjBhMzQ5M2ViZjQ5YzIzMjFmMjlmOTg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZjgyNzg3OTJlYWE0OGVmYTZiZGZhN2ZiYTZjYjkxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNzNhZjE1ZDY2Y2I0OTAxOWY0NzllNDMwNTVjMjYwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjczYWYxNWQ2NmNiNDkwMTlmNDc5ZTQzMDU1YzI2MDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmODI3ODc5MmVhYTQ4ZWZhNmJkZmE3ZmJhNmNiOTE0LnNldENvbnRlbnQoaHRtbF9mNzNhZjE1ZDY2Y2I0OTAxOWY0NzllNDMwNTVjMjYwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMzgzNTdlNDIwYTM0OTNlYmY0OWMyMzIxZjI5Zjk4Ni5iaW5kUG9wdXAocG9wdXBfZGY4Mjc4NzkyZWFhNDhlZmE2YmRmYTdmYmE2Y2I5MTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODBjNDZkOWUzYjI1NDE4ZTg0NjBhMzJlODM1NmJiMzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZWU2ZmU1ZDkxNGY0NTA2YmZhZDZhZjU2Zjc3ZTJhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTdhZThjNDViZGE0MzZmOTJmYjE2NTFmMTkzNmMwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjE3YWU4YzQ1YmRhNDM2ZjkyZmIxNjUxZjE5MzZjMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmVlNmZlNWQ5MTRmNDUwNmJmYWQ2YWY1NmY3N2UyYWYuc2V0Q29udGVudChodG1sX2IxN2FlOGM0NWJkYTQzNmY5MmZiMTY1MWYxOTM2YzAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgwYzQ2ZDllM2IyNTQxOGU4NDYwYTMyZTgzNTZiYjM5LmJpbmRQb3B1cChwb3B1cF9mZWU2ZmU1ZDkxNGY0NTA2YmZhZDZhZjU2Zjc3ZTJhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MDJlNDA4ODg5YWY0ZjgxODNhNGYyMWU5M2U2MmJiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOGE2MWIwMTQ0ZWM0YzdhYTJkZWU1ZWFiMDE2MzZkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNTE3Zjk0MTM3OWE0Mjg5OTk4NzEzMDY3YmMxODEzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjUxN2Y5NDEzNzlhNDI4OTk5ODcxMzA2N2JjMTgxM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOGE2MWIwMTQ0ZWM0YzdhYTJkZWU1ZWFiMDE2MzZkMS5zZXRDb250ZW50KGh0bWxfMjUxN2Y5NDEzNzlhNDI4OTk5ODcxMzA2N2JjMTgxM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTAyZTQwODg4OWFmNGY4MTgzYTRmMjFlOTNlNjJiYjYuYmluZFBvcHVwKHBvcHVwXzM4YTYxYjAxNDRlYzRjN2FhMmRlZTVlYWIwMTYzNmQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzOWJlNjI2MWZkYjRmZDViNDNhODliYTYwYjI2MmY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlZTljMGVlNDE1YTQ1YWM4Y2JlNjExNTA5NGU2NmU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiZDViYzU5NDcxNjQ3ZjNiZDgxMTU1ZjU1ZGI0NzZhID0gJCgnPGRpdiBpZD0iaHRtbF82YmQ1YmM1OTQ3MTY0N2YzYmQ4MTE1NWY1NWRiNDc2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlZTljMGVlNDE1YTQ1YWM4Y2JlNjExNTA5NGU2NmU0LnNldENvbnRlbnQoaHRtbF82YmQ1YmM1OTQ3MTY0N2YzYmQ4MTE1NWY1NWRiNDc2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzliZTYyNjFmZGI0ZmQ1YjQzYTg5YmE2MGIyNjJmNC5iaW5kUG9wdXAocG9wdXBfN2VlOWMwZWU0MTVhNDVhYzhjYmU2MTE1MDk0ZTY2ZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWIzODdlODA4YzQwNDY2NDg3MTE4NmY1NTFlYjg2MDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiZDlkM2IwZTk4NDRiMDhiZmE3MTE2OGQ3M2FkNmM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyMGI1MGRkY2NiYzQ0ZmJiYjcwMTNhYWQzY2IyZTVkID0gJCgnPGRpdiBpZD0iaHRtbF9lMjBiNTBkZGNjYmM0NGZiYmI3MDEzYWFkM2NiMmU1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JkOWQzYjBlOTg0NGIwOGJmYTcxMTY4ZDczYWQ2YzYuc2V0Q29udGVudChodG1sX2UyMGI1MGRkY2NiYzQ0ZmJiYjcwMTNhYWQzY2IyZTVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViMzg3ZTgwOGM0MDQ2NjQ4NzExODZmNTUxZWI4NjA3LmJpbmRQb3B1cChwb3B1cF9jYmQ5ZDNiMGU5ODQ0YjA4YmZhNzExNjhkNzNhZDZjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ODUyZGQ1ODA3MzY0YmYyOTNmYTEzMTlkZWIwMDEyOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxNzg2ODU0N2RkZDRmOGY5NTRkMTZhZmZiNDViMjFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlM2ViYWI5ZGM1MjQ4NThiNmY5ZTBiNGUxNjc2MzI5ID0gJCgnPGRpdiBpZD0iaHRtbF9jZTNlYmFiOWRjNTI0ODU4YjZmOWUwYjRlMTY3NjMyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTc4Njg1NDdkZGQ0ZjhmOTU0ZDE2YWZmYjQ1YjIxYi5zZXRDb250ZW50KGh0bWxfY2UzZWJhYjlkYzUyNDg1OGI2ZjllMGI0ZTE2NzYzMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODg1MmRkNTgwNzM2NGJmMjkzZmExMzE5ZGViMDAxMjkuYmluZFBvcHVwKHBvcHVwX2QxNzg2ODU0N2RkZDRmOGY5NTRkMTZhZmZiNDViMjFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzMjY1YzkyOTZjNTQ1NGRhOThhMTc0ZGFhNDlkNjY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzZDU4YTliZjMwNDQyYThhNDBiMTYzYmZjNjNhNTMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgzZTA2NDU2ZjgwNjRlNzI4NzBkMzJiOGUyNjNiM2I5ID0gJCgnPGRpdiBpZD0iaHRtbF84M2UwNjQ1NmY4MDY0ZTcyODcwZDMyYjhlMjYzYjNiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzZDU4YTliZjMwNDQyYThhNDBiMTYzYmZjNjNhNTMwLnNldENvbnRlbnQoaHRtbF84M2UwNjQ1NmY4MDY0ZTcyODcwZDMyYjhlMjYzYjNiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzI2NWM5Mjk2YzU0NTRkYTk4YTE3NGRhYTQ5ZDY2OC5iaW5kUG9wdXAocG9wdXBfOTNkNThhOWJmMzA0NDJhOGE0MGIxNjNiZmM2M2E1MzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTkxYzNjYWQ1Mzc0NDQ4NWIyNTcxMjhmM2E2MjZjZjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQ0ZjliNmQ3NzYxNGQ4YTlhYzhiODU4NDI4NzE5OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTAwMTVkZjIxOTEwNGJmNjk5YTY2MTFiZDVhYThhMjcgPSAkKCc8ZGl2IGlkPSJodG1sX2UwMDE1ZGYyMTkxMDRiZjY5OWE2NjExYmQ1YWE4YTI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNDRmOWI2ZDc3NjE0ZDhhOWFjOGI4NTg0Mjg3MTk5Ni5zZXRDb250ZW50KGh0bWxfZTAwMTVkZjIxOTEwNGJmNjk5YTY2MTFiZDVhYThhMjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTkxYzNjYWQ1Mzc0NDQ4NWIyNTcxMjhmM2E2MjZjZjcuYmluZFBvcHVwKHBvcHVwXzA0NGY5YjZkNzc2MTRkOGE5YWM4Yjg1ODQyODcxOTk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1NGEwN2U0MjYxZjRkNDA4ZGZlZWMxNzM1M2IzYTZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3N2YxOTgwMjA2YzQ0NjlhY2RkNTIwZTRlMmQ1ZDU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3YzliY2M4MmJiNTRlMWI5NjQ4ZDc0ZmY4Y2IwYjM3ID0gJCgnPGRpdiBpZD0iaHRtbF9lN2M5YmNjODJiYjU0ZTFiOTY0OGQ3NGZmOGNiMGIzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3N2YxOTgwMjA2YzQ0NjlhY2RkNTIwZTRlMmQ1ZDU0LnNldENvbnRlbnQoaHRtbF9lN2M5YmNjODJiYjU0ZTFiOTY0OGQ3NGZmOGNiMGIzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNTRhMDdlNDI2MWY0ZDQwOGRmZWVjMTczNTNiM2E2ZC5iaW5kUG9wdXAocG9wdXBfZjc3ZjE5ODAyMDZjNDQ2OWFjZGQ1MjBlNGUyZDVkNTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmEyM2E4NTFhZjMyNDhmZWE4MWM0YTE1ODFiNDNjZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzYWUyZGJiYTZlYTQ2NGU5ODBlMmI3YmYyMjAyODYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhMTg4NGJkY2E4MDRlYjI5MjdhZDYyYTlhMjY5ZGE4ID0gJCgnPGRpdiBpZD0iaHRtbF9kYTE4ODRiZGNhODA0ZWIyOTI3YWQ2MmE5YTI2OWRhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjNhZTJkYmJhNmVhNDY0ZTk4MGUyYjdiZjIyMDI4NjIuc2V0Q29udGVudChodG1sX2RhMTg4NGJkY2E4MDRlYjI5MjdhZDYyYTlhMjY5ZGE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhMjNhODUxYWYzMjQ4ZmVhODFjNGExNTgxYjQzY2ViLmJpbmRQb3B1cChwb3B1cF9iM2FlMmRiYmE2ZWE0NjRlOTgwZTJiN2JmMjIwMjg2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODgzNDhkMTRkMzM0OWViODdlMDZlYzg3OTQ4YjFjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YzQ4OWY1ODJlNjc0OGUyOWM3MDU0N2JiMWQ3ZmJhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MWQxM2YzMzk3ZjE0NTA2OTY5YTBhMzIxNGI3Y2MwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzFkMTNmMzM5N2YxNDUwNjk2OWEwYTMyMTRiN2NjMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YzQ4OWY1ODJlNjc0OGUyOWM3MDU0N2JiMWQ3ZmJhOC5zZXRDb250ZW50KGh0bWxfNzFkMTNmMzM5N2YxNDUwNjk2OWEwYTMyMTRiN2NjMGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjg4MzQ4ZDE0ZDMzNDllYjg3ZTA2ZWM4Nzk0OGIxY2MuYmluZFBvcHVwKHBvcHVwXzdjNDg5ZjU4MmU2NzQ4ZTI5YzcwNTQ3YmIxZDdmYmE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y1ZGU4MzVjOGRmNzQwNTQ4YzAzZWJkMjFmMGI1NmQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwNmE0ZjVmMjlhYzRkMmI5MTgzNzMwNzE4OGRmODkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4MzZlNDk0NTVlYzQ4M2ViZWY0NDQ0NjZiY2E0NjI2ID0gJCgnPGRpdiBpZD0iaHRtbF82ODM2ZTQ5NDU1ZWM0ODNlYmVmNDQ0NDY2YmNhNDYyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDZhNGY1ZjI5YWM0ZDJiOTE4MzczMDcxODhkZjg5MS5zZXRDb250ZW50KGh0bWxfNjgzNmU0OTQ1NWVjNDgzZWJlZjQ0NDQ2NmJjYTQ2MjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjVkZTgzNWM4ZGY3NDA1NDhjMDNlYmQyMWYwYjU2ZDcuYmluZFBvcHVwKHBvcHVwXzIwNmE0ZjVmMjlhYzRkMmI5MTgzNzMwNzE4OGRmODkxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1ZGFjNDFlNTY4NTQwNDY5OTdjMzQ3ZDcxNWQ5NDZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5MTI4OGFkYmRmMDQyNDZiMjQ4YjY4MjZlYTI0YzVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxYzU5NDFkMWYzYjRkMDI4ZjY1OTdlZDkyYmY1ZTExID0gJCgnPGRpdiBpZD0iaHRtbF9mMWM1OTQxZDFmM2I0ZDAyOGY2NTk3ZWQ5MmJmNWUxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTEyODhhZGJkZjA0MjQ2YjI0OGI2ODI2ZWEyNGM1ZC5zZXRDb250ZW50KGh0bWxfZjFjNTk0MWQxZjNiNGQwMjhmNjU5N2VkOTJiZjVlMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTVkYWM0MWU1Njg1NDA0Njk5N2MzNDdkNzE1ZDk0NmMuYmluZFBvcHVwKHBvcHVwXzY5MTI4OGFkYmRmMDQyNDZiMjQ4YjY4MjZlYTI0YzVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwZDkxMDQxNjI2ZDQwNjg5ZDIxNDlmNDZmN2UzZjk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ZjRmMjA5NzUwZjQwOWNhNmIzNjM5MjI4NmEzNDQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjNjgyZGE1MGU0ZjQ2NzA4YWE1YmFlNjdkZTRjMDkxID0gJCgnPGRpdiBpZD0iaHRtbF9iYzY4MmRhNTBlNGY0NjcwOGFhNWJhZTY3ZGU0YzA5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZThmNGYyMDk3NTBmNDA5Y2E2YjM2MzkyMjg2YTM0NDcuc2V0Q29udGVudChodG1sX2JjNjgyZGE1MGU0ZjQ2NzA4YWE1YmFlNjdkZTRjMDkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwZDkxMDQxNjI2ZDQwNjg5ZDIxNDlmNDZmN2UzZjk2LmJpbmRQb3B1cChwb3B1cF9lOGY0ZjIwOTc1MGY0MDljYTZiMzYzOTIyODZhMzQ0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMmM0NjAxNDI4ZTA0OTQ2YmNhNjU0OGI4ZTgzZjRmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDhiNzQ4M2Q5MGEwNDc0MWEyNzM4YzVjOWI4ZWU5M2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWM5NTEwZWI5NGI3NDNkODhmMzVlNzEyNzZlZDU0NWIgPSAkKCc8ZGl2IGlkPSJodG1sX2VjOTUxMGViOTRiNzQzZDg4ZjM1ZTcxMjc2ZWQ1NDViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA4Yjc0ODNkOTBhMDQ3NDFhMjczOGM1YzliOGVlOTNmLnNldENvbnRlbnQoaHRtbF9lYzk1MTBlYjk0Yjc0M2Q4OGYzNWU3MTI3NmVkNTQ1Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMmM0NjAxNDI4ZTA0OTQ2YmNhNjU0OGI4ZTgzZjRmNy5iaW5kUG9wdXAocG9wdXBfMDhiNzQ4M2Q5MGEwNDc0MWEyNzM4YzVjOWI4ZWU5M2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTYzYTAwNTU2NWIxNDZhNGI5MThlYzFkNmJhODQyODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIxYWUxNGFiMjJiODRhNzNiYjk5M2JmYjIzYmY1N2Y0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjZDI0NzEzNTJiNTRmNTY5MWI3NmFiMGRjMzdhNzU4ID0gJCgnPGRpdiBpZD0iaHRtbF9hY2QyNDcxMzUyYjU0ZjU2OTFiNzZhYjBkYzM3YTc1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIxYWUxNGFiMjJiODRhNzNiYjk5M2JmYjIzYmY1N2Y0LnNldENvbnRlbnQoaHRtbF9hY2QyNDcxMzUyYjU0ZjU2OTFiNzZhYjBkYzM3YTc1OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NjNhMDA1NTY1YjE0NmE0YjkxOGVjMWQ2YmE4NDI4Ny5iaW5kUG9wdXAocG9wdXBfMjFhZTE0YWIyMmI4NGE3M2JiOTkzYmZiMjNiZjU3ZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTgxYjgxMDg2YjI2NDEwMTkzODczZmUxN2ZmODc3OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3NWM2ZTJiMTMwMDRhZjZiMGUyZjc4MDc2ZDhhMThjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4YTk0YjM3OWJiOTQxMGM4NzA1ZjlhZjA4NWQ5YWZlID0gJCgnPGRpdiBpZD0iaHRtbF80OGE5NGIzNzliYjk0MTBjODcwNWY5YWYwODVkOWFmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjc1YzZlMmIxMzAwNGFmNmIwZTJmNzgwNzZkOGExOGMuc2V0Q29udGVudChodG1sXzQ4YTk0YjM3OWJiOTQxMGM4NzA1ZjlhZjA4NWQ5YWZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U4MWI4MTA4NmIyNjQxMDE5Mzg3M2ZlMTdmZjg3NzhlLmJpbmRQb3B1cChwb3B1cF8yNzVjNmUyYjEzMDA0YWY2YjBlMmY3ODA3NmQ4YTE4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOWZiNGM0ZjFlY2U0NDdmODRlOWUxOTY2ZjkxMmY2YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmViZjNhMzViMTIwNDA4Yjg1NTQwMjM3YzI3ODgzOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmUxNjFjODVhOTQ0NDA2ZGIwMGZjYWQ2Mjc3Zjk1NDYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZlMTYxYzg1YTk0NDQwNmRiMDBmY2FkNjI3N2Y5NTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmViZjNhMzViMTIwNDA4Yjg1NTQwMjM3YzI3ODgzOGMuc2V0Q29udGVudChodG1sX2ZlMTYxYzg1YTk0NDQwNmRiMDBmY2FkNjI3N2Y5NTQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5ZmI0YzRmMWVjZTQ0N2Y4NGU5ZTE5NjZmOTEyZjZiLmJpbmRQb3B1cChwb3B1cF9mZWJmM2EzNWIxMjA0MDhiODU1NDAyMzdjMjc4ODM4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZDQ2MWRjNzFhMWE0MjE2YjFlY2ExYjIwMTg4ZjllMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmYTgzMGZmNjA2ZDQ4MTFiNzllMjg2NDc5MDc5MmNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5OTcxZTk5NGMxZjRhOWRhODgyYmE1MTJkMDM4YzkzID0gJCgnPGRpdiBpZD0iaHRtbF9lOTk3MWU5OTRjMWY0YTlkYTg4MmJhNTEyZDAzOGM5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZmE4MzBmZjYwNmQ0ODExYjc5ZTI4NjQ3OTA3OTJjYi5zZXRDb250ZW50KGh0bWxfZTk5NzFlOTk0YzFmNGE5ZGE4ODJiYTUxMmQwMzhjOTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGQ0NjFkYzcxYTFhNDIxNmIxZWNhMWIyMDE4OGY5ZTMuYmluZFBvcHVwKHBvcHVwX2FmYTgzMGZmNjA2ZDQ4MTFiNzllMjg2NDc5MDc5MmNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyZmY4M2VjYjE3ODRjMmNhM2QwMjJhZGQ0NDM0YThlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiNjg5Y2IxOGE4YzQyNjhiYjRkZWYyZTBhMDI4MmNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1NjdmYThkNjA3ODRhNjE5MTI5YzE5YTQwMDQ2YzA0ID0gJCgnPGRpdiBpZD0iaHRtbF8zNTY3ZmE4ZDYwNzg0YTYxOTEyOWMxOWE0MDA0NmMwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiNjg5Y2IxOGE4YzQyNjhiYjRkZWYyZTBhMDI4MmNiLnNldENvbnRlbnQoaHRtbF8zNTY3ZmE4ZDYwNzg0YTYxOTEyOWMxOWE0MDA0NmMwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMmZmODNlY2IxNzg0YzJjYTNkMDIyYWRkNDQzNGE4ZS5iaW5kUG9wdXAocG9wdXBfYmI2ODljYjE4YThjNDI2OGJiNGRlZjJlMGEwMjgyY2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTAxNjMxNjZjYzQ0NDI4OTlmMzBmYjhiMTQ4MjYyMGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI5NTJmNzYzZTlkODQ4NzRhYmU2MGY3MTRiZWEyNTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5NGJmNDBmMTE5YTQ0ODZhOTQ5ZGI4NzY2MzI0MzEyID0gJCgnPGRpdiBpZD0iaHRtbF81OTRiZjQwZjExOWE0NDg2YTk0OWRiODc2NjMyNDMxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjk1MmY3NjNlOWQ4NDg3NGFiZTYwZjcxNGJlYTI1MWMuc2V0Q29udGVudChodG1sXzU5NGJmNDBmMTE5YTQ0ODZhOTQ5ZGI4NzY2MzI0MzEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkwMTYzMTY2Y2M0NDQyODk5ZjMwZmI4YjE0ODI2MjBiLmJpbmRQb3B1cChwb3B1cF8yOTUyZjc2M2U5ZDg0ODc0YWJlNjBmNzE0YmVhMjUxYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNzM0NmJiNDAwZGE0ZmNjYTkzNTEwNWNlOGJkMDQ4MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNDJiNmRlMzNiYjA0OWFhYjRlYjVmYzVjNzdhYmEyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MmJkOGVjMGJkZjY0M2VkODQ4OTJlNGI3ZmEyYjA2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTJiZDhlYzBiZGY2NDNlZDg0ODkyZTRiN2ZhMmIwNjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTQyYjZkZTMzYmIwNDlhYWI0ZWI1ZmM1Yzc3YWJhMjguc2V0Q29udGVudChodG1sXzUyYmQ4ZWMwYmRmNjQzZWQ4NDg5MmU0YjdmYTJiMDYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3MzQ2YmI0MDBkYTRmY2NhOTM1MTA1Y2U4YmQwNDgyLmJpbmRQb3B1cChwb3B1cF8xNDJiNmRlMzNiYjA0OWFhYjRlYjVmYzVjNzdhYmEyOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYjcxODQ2ZjRjMGQ0NzJkOWVjOWFhMWI2ZDFhZjEwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NDdkZDE4MjVjMWQ0NzVlYTljZTFlOTE1NDYyZGI2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzM1YjIzMjI1OTQ0YjU3OWM5M2FhYzIwM2JiYThjNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDMzNWIyMzIyNTk0NGI1NzljOTNhYWMyMDNiYmE4YzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0N2RkMTgyNWMxZDQ3NWVhOWNlMWU5MTU0NjJkYjZlLnNldENvbnRlbnQoaHRtbF80MzM1YjIzMjI1OTQ0YjU3OWM5M2FhYzIwM2JiYThjNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYjcxODQ2ZjRjMGQ0NzJkOWVjOWFhMWI2ZDFhZjEwZi5iaW5kUG9wdXAocG9wdXBfODQ3ZGQxODI1YzFkNDc1ZWE5Y2UxZTkxNTQ2MmRiNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjM1MDcxM2UyOWRlNDM4Y2FhMDU3NGRiMGZkNzcwZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2OGQ0NTQ5OTU5ZjQzM2M5NmJlOWNhODZlMzZmYmNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwZmIzM2I3ZGRjMzRlMDM4ZWZkOWI5MTRhOGIzMTA5ID0gJCgnPGRpdiBpZD0iaHRtbF85MGZiMzNiN2RkYzM0ZTAzOGVmZDliOTE0YThiMzEwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY4ZDQ1NDk5NTlmNDMzYzk2YmU5Y2E4NmUzNmZiY2Uuc2V0Q29udGVudChodG1sXzkwZmIzM2I3ZGRjMzRlMDM4ZWZkOWI5MTRhOGIzMTA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YzNTA3MTNlMjlkZTQzOGNhYTA1NzRkYjBmZDc3MGVmLmJpbmRQb3B1cChwb3B1cF8yNjhkNDU0OTk1OWY0MzNjOTZiZTljYTg2ZTM2ZmJjZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzEwNDc4MWU2NDA0NTYzYmY1YjcwMjQ0ZTQ3NWU5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjU5NGFkZTlkZmI0ZGQxOTlkYzIyZDc4YTFiMjJjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYTQ5ODEwY2UwMTE0ZGI3YjE5MmU1ZDQ1M2Q5NTNmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGE0OTgxMGNlMDExNGRiN2IxOTJlNWQ0NTNkOTUzZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI1OTRhZGU5ZGZiNGRkMTk5ZGMyMmQ3OGExYjIyYzYuc2V0Q29udGVudChodG1sXzBhNDk4MTBjZTAxMTRkYjdiMTkyZTVkNDUzZDk1M2ZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzMTA0NzgxZTY0MDQ1NjNiZjViNzAyNDRlNDc1ZTlkLmJpbmRQb3B1cChwb3B1cF9iMjU5NGFkZTlkZmI0ZGQxOTlkYzIyZDc4YTFiMjJjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81Y2U0YjgzYjU5YWY0MjBiYmNiYTczNDMzZWI5ZjZjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzkxNWM4MDA1MWFhNGQ2NGE2NzYxMDJiOTAwZjM5M2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTZmNDI0M2JlYzhjNGNkYzg4Y2YxNGFjZWRmMGUzZTggPSAkKCc8ZGl2IGlkPSJodG1sXzU2ZjQyNDNiZWM4YzRjZGM4OGNmMTRhY2VkZjBlM2U4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOTE1YzgwMDUxYWE0ZDY0YTY3NjEwMmI5MDBmMzkzYi5zZXRDb250ZW50KGh0bWxfNTZmNDI0M2JlYzhjNGNkYzg4Y2YxNGFjZWRmMGUzZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWNlNGI4M2I1OWFmNDIwYmJjYmE3MzQzM2ViOWY2YzYuYmluZFBvcHVwKHBvcHVwX2M5MTVjODAwNTFhYTRkNjRhNjc2MTAyYjkwMGYzOTNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzYWU0ZmIxN2U1YjQ0YmRiYmY3N2RkZWJmNjY1NzQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNmMyMWExMTZlMDA0YTNjOTU2ZWRkZjZmZjIyODgzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOTU2MzM1ZjNiNDQ0NjUwODQwMGI1ZTYxNzY1MDI2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzk1NjMzNWYzYjQ0NDY1MDg0MDBiNWU2MTc2NTAyNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M2YzIxYTExNmUwMDRhM2M5NTZlZGRmNmZmMjI4ODM2LnNldENvbnRlbnQoaHRtbF9jOTU2MzM1ZjNiNDQ0NjUwODQwMGI1ZTYxNzY1MDI2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yM2FlNGZiMTdlNWI0NGJkYmJmNzdkZGViZjY2NTc0OS5iaW5kUG9wdXAocG9wdXBfYzZjMjFhMTE2ZTAwNGEzYzk1NmVkZGY2ZmYyMjg4MzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmI3OGU5NjQ0YjNhNGNjNTgxNTFlMmE0MzQ1YTczZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlMTA0N2IzNzRhNzQ4NGJiMzc5MmZiYzExY2YzZWViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2OWEzNTVlNjgwNTQxMGM5NzgyNTVhMzgzMTQyODczID0gJCgnPGRpdiBpZD0iaHRtbF82NjlhMzU1ZTY4MDU0MTBjOTc4MjU1YTM4MzE0Mjg3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWUxMDQ3YjM3NGE3NDg0YmIzNzkyZmJjMTFjZjNlZWIuc2V0Q29udGVudChodG1sXzY2OWEzNTVlNjgwNTQxMGM5NzgyNTVhMzgzMTQyODczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiNzhlOTY0NGIzYTRjYzU4MTUxZTJhNDM0NWE3M2VjLmJpbmRQb3B1cChwb3B1cF9hZTEwNDdiMzc0YTc0ODRiYjM3OTJmYmMxMWNmM2VlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYzFlY2I5YmMyZjc0ZWQ4ODU0MTM0YTVmNDM1MTQ5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzgzNTk1ZDIwYTJmNDM0ZmIxZmFhZjMwOGE3ZDAzNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA1NWUwNGEyNDQzNGM0YzlhY2U4OGUyMmNkNjJkYjQgPSAkKCc8ZGl2IGlkPSJodG1sX2YwNTVlMDRhMjQ0MzRjNGM5YWNlODhlMjJjZDYyZGI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODM1OTVkMjBhMmY0MzRmYjFmYWFmMzA4YTdkMDM1ZC5zZXRDb250ZW50KGh0bWxfZjA1NWUwNGEyNDQzNGM0YzlhY2U4OGUyMmNkNjJkYjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGMxZWNiOWJjMmY3NGVkODg1NDEzNGE1ZjQzNTE0OTUuYmluZFBvcHVwKHBvcHVwXzM4MzU5NWQyMGEyZjQzNGZiMWZhYWYzMDhhN2QwMzVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3NGZhNDlmMGI5ZTRiYjA5Nzc2MDU4NmVjNGVkNGUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDY4YmVjNTRhMjIxNDcwNWIxNDUwODFmNDhmZjZhYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGNhM2M1MWU2YWQ5NGRmNTg4NGRhNGM0OWU1ZmFiNzYgPSAkKCc8ZGl2IGlkPSJodG1sX2RjYTNjNTFlNmFkOTRkZjU4ODRkYTRjNDllNWZhYjc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2OGJlYzU0YTIyMTQ3MDViMTQ1MDgxZjQ4ZmY2YWI0LnNldENvbnRlbnQoaHRtbF9kY2EzYzUxZTZhZDk0ZGY1ODg0ZGE0YzQ5ZTVmYWI3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzRmYTQ5ZjBiOWU0YmIwOTc3NjA1ODZlYzRlZDRlMy5iaW5kUG9wdXAocG9wdXBfZDY4YmVjNTRhMjIxNDcwNWIxNDUwODFmNDhmZjZhYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjAyZTZlMjgyM2Y5NDYzMzlkOTgwOTczZjY1YWQ2MjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MzIwNzEzNWI3MmU0MDhlYWI4YzdlYzRlMjVlMjM5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNGY4ZGU0MDY3MDI0ZDg1YmMwOGQyY2VmYzFjZWEyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDRmOGRlNDA2NzAyNGQ4NWJjMDhkMmNlZmMxY2VhMjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzIwNzEzNWI3MmU0MDhlYWI4YzdlYzRlMjVlMjM5Yi5zZXRDb250ZW50KGh0bWxfMDRmOGRlNDA2NzAyNGQ4NWJjMDhkMmNlZmMxY2VhMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjAyZTZlMjgyM2Y5NDYzMzlkOTgwOTczZjY1YWQ2MjMuYmluZFBvcHVwKHBvcHVwXzkzMjA3MTM1YjcyZTQwOGVhYjhjN2VjNGUyNWUyMzliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkYjJkZTlmMmUyYzQ0MGJhYzI4NzFkMTBkYTNlMDJmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhmOWE4MmIzMDljNGY3YjhmOTllYWRlNDc3NGZmZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTlmNzQxY2E5NzlkNDkwNTlmNjhlMDhjMzBiMGJhOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzU5Zjc0MWNhOTc5ZDQ5MDU5ZjY4ZTA4YzMwYjBiYTk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhmOWE4MmIzMDljNGY3YjhmOTllYWRlNDc3NGZmZDQuc2V0Q29udGVudChodG1sXzU5Zjc0MWNhOTc5ZDQ5MDU5ZjY4ZTA4YzMwYjBiYTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhkYjJkZTlmMmUyYzQ0MGJhYzI4NzFkMTBkYTNlMDJmLmJpbmRQb3B1cChwb3B1cF84OGY5YTgyYjMwOWM0ZjdiOGY5OWVhZGU0Nzc0ZmZkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYzhiYzczMmQyOGQ0MDE2ODc1MGU2OTRlOTY5ZDlkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2VmYjE5NTMxM2E2NGVkOThmZjg5ZThkMTBiYmQ4ZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjI0YmQwMTMzMTVkNGZhODhkZjY2NzkwMTdhZjEyMTQgPSAkKCc8ZGl2IGlkPSJodG1sXzYyNGJkMDEzMzE1ZDRmYTg4ZGY2Njc5MDE3YWYxMjE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2VmYjE5NTMxM2E2NGVkOThmZjg5ZThkMTBiYmQ4ZDEuc2V0Q29udGVudChodG1sXzYyNGJkMDEzMzE1ZDRmYTg4ZGY2Njc5MDE3YWYxMjE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjOGJjNzMyZDI4ZDQwMTY4NzUwZTY5NGU5NjlkOWQxLmJpbmRQb3B1cChwb3B1cF83ZWZiMTk1MzEzYTY0ZWQ5OGZmODllOGQxMGJiZDhkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMWEyMmI5MjVlZTk0YTAzOTdiNmMyMGI2MTBjNzAzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjE5NjdiMTQyMWFmNDBiYTlmYmZhMmNhYWNlMmQ1NDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmMwNzA3YmE4OTc5NGUzYWFmZjU5MmJhMjc1NDdkNzggPSAkKCc8ZGl2IGlkPSJodG1sX2JjMDcwN2JhODk3OTRlM2FhZmY1OTJiYTI3NTQ3ZDc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxOTY3YjE0MjFhZjQwYmE5ZmJmYTJjYWFjZTJkNTQwLnNldENvbnRlbnQoaHRtbF9iYzA3MDdiYTg5Nzk0ZTNhYWZmNTkyYmEyNzU0N2Q3OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMWEyMmI5MjVlZTk0YTAzOTdiNmMyMGI2MTBjNzAzZC5iaW5kUG9wdXAocG9wdXBfYjE5NjdiMTQyMWFmNDBiYTlmYmZhMmNhYWNlMmQ1NDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDA4YzNmMzQ4YWM4NDE5ZDk2OWFmYzMwM2MxYWQ1YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODdjZGM2NTJhN2EyNDVhYzljYjY2M2ViZTlmYTdjYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM4ZmI1NGY4YThhNDMwN2EwNTZmNTc3MjcyMTEzNmEgPSAkKCc8ZGl2IGlkPSJodG1sXzAzOGZiNTRmOGE4YTQzMDdhMDU2ZjU3NzI3MjExMzZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3Y2RjNjUyYTdhMjQ1YWM5Y2I2NjNlYmU5ZmE3Y2M2LnNldENvbnRlbnQoaHRtbF8wMzhmYjU0ZjhhOGE0MzA3YTA1NmY1NzcyNzIxMTM2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMDhjM2YzNDhhYzg0MTlkOTY5YWZjMzAzYzFhZDViZi5iaW5kUG9wdXAocG9wdXBfODdjZGM2NTJhN2EyNDVhYzljYjY2M2ViZTlmYTdjYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDdlYjY1YWQzZDhhNDc3NWEyMmI3MDQ4Yzk2MTczODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2ZkOGExMzE3NGJkNGZmNWIyMGUyY2RkYTNmMDE3OGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNiMGFmZTM1MTllNGUwYjk3NzkxYWYxYjFjOWQ0OTcgPSAkKCc8ZGl2IGlkPSJodG1sXzhjYjBhZmUzNTE5ZTRlMGI5Nzc5MWFmMWIxYzlkNDk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2ZkOGExMzE3NGJkNGZmNWIyMGUyY2RkYTNmMDE3OGUuc2V0Q29udGVudChodG1sXzhjYjBhZmUzNTE5ZTRlMGI5Nzc5MWFmMWIxYzlkNDk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3ZWI2NWFkM2Q4YTQ3NzVhMjJiNzA0OGM5NjE3Mzg1LmJpbmRQb3B1cChwb3B1cF83ZmQ4YTEzMTc0YmQ0ZmY1YjIwZTJjZGRhM2YwMTc4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDdmNWFjM2U3NzE0YzhmODY5ZWY4OTg1MjJkMjQzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZDc1YTdjNzBlMjU0OGY5YmE0ZTRhNDE4ZDAyZDRkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OThiZGU1NGUwYzc0ZDUyOTg2MTM3ODEzMmE3OWY0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDk4YmRlNTRlMGM3NGQ1Mjk4NjEzNzgxMzJhNzlmNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkNzVhN2M3MGUyNTQ4ZjliYTRlNGE0MThkMDJkNGQ2LnNldENvbnRlbnQoaHRtbF80OThiZGU1NGUwYzc0ZDUyOTg2MTM3ODEzMmE3OWY0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NDdmNWFjM2U3NzE0YzhmODY5ZWY4OTg1MjJkMjQzNC5iaW5kUG9wdXAocG9wdXBfMmQ3NWE3YzcwZTI1NDhmOWJhNGU0YTQxOGQwMmQ0ZDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWEzZjdmYWNmZTdhNDg2NjlmNGY0ZDk5MmM2MTc5MDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNzZmZWExOWJkNTM0M2I2YmJjM2EwYjY4YTI4MDJhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMjRjNjM2M2ZmM2M0Zjk1YWI2ZjBiYzFkZDI5NzdmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjI0YzYzNjNmZjNjNGY5NWFiNmYwYmMxZGQyOTc3ZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzZmZWExOWJkNTM0M2I2YmJjM2EwYjY4YTI4MDJhZS5zZXRDb250ZW50KGh0bWxfZjI0YzYzNjNmZjNjNGY5NWFiNmYwYmMxZGQyOTc3ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWEzZjdmYWNmZTdhNDg2NjlmNGY0ZDk5MmM2MTc5MDUuYmluZFBvcHVwKHBvcHVwX2I3NmZlYTE5YmQ1MzQzYjZiYmMzYTBiNjhhMjgwMmFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2NjM4MzBiY2Y1OTRiNDM5ZDhiNzdkOWQ4MjRkNWI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0MjJiYWYyNjlmNjQ1ZWI4ZjE5MTk4NGE5NzBkNjVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4MmRhZTI5YjVmNzQwMDc4NWI1ZDgyY2NkZDk0ZTM1ID0gJCgnPGRpdiBpZD0iaHRtbF9kODJkYWUyOWI1Zjc0MDA3ODViNWQ4MmNjZGQ5NGUzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDIyYmFmMjY5ZjY0NWViOGYxOTE5ODRhOTcwZDY1Yy5zZXRDb250ZW50KGh0bWxfZDgyZGFlMjliNWY3NDAwNzg1YjVkODJjY2RkOTRlMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjY2MzgzMGJjZjU5NGI0MzlkOGI3N2Q5ZDgyNGQ1YjQuYmluZFBvcHVwKHBvcHVwXzc0MjJiYWYyNjlmNjQ1ZWI4ZjE5MTk4NGE5NzBkNjVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4NGE3ZTYxYmY2NDRlOWRiN2MxOTljYzFlNWI4YTk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyNTg0MDE1MWM0MDQ5YjI4NGZhYTAzYzQyMjY2Njk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2MWVmZWE4ZTQwZTRmYTU4Y2QyODRhMjljZmMyY2EzID0gJCgnPGRpdiBpZD0iaHRtbF80NjFlZmVhOGU0MGU0ZmE1OGNkMjg0YTI5Y2ZjMmNhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjU4NDAxNTFjNDA0OWIyODRmYWEwM2M0MjI2NjY5NC5zZXRDb250ZW50KGh0bWxfNDYxZWZlYThlNDBlNGZhNThjZDI4NGEyOWNmYzJjYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTg0YTdlNjFiZjY0NGU5ZGI3YzE5OWNjMWU1YjhhOTguYmluZFBvcHVwKHBvcHVwXzYyNTg0MDE1MWM0MDQ5YjI4NGZhYTAzYzQyMjY2Njk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjM2NiNThmYWY2OTQ3ZWViZTAwMzQ4YmVmNmE4OGFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhjMzY0YTBhMzViZDQ3Mjc4NWRhZDA0ZGI3YWQ4YzU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkZDNmZDE4ODdmYjQ5ZjM5M2FlMzQ0MDE1ZWNjNWIxID0gJCgnPGRpdiBpZD0iaHRtbF9hZGQzZmQxODg3ZmI0OWYzOTNhZTM0NDAxNWVjYzViMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YzM2NGEwYTM1YmQ0NzI3ODVkYWQwNGRiN2FkOGM1OC5zZXRDb250ZW50KGh0bWxfYWRkM2ZkMTg4N2ZiNDlmMzkzYWUzNDQwMTVlY2M1YjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWMzY2I1OGZhZjY5NDdlZWJlMDAzNDhiZWY2YTg4YWQuYmluZFBvcHVwKHBvcHVwXzhjMzY0YTBhMzViZDQ3Mjc4NWRhZDA0ZGI3YWQ4YzU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4OTE4N2FkYWFmODQxZTI4OWQ4ZTYyN2I3NGQxYmI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwZjQ0YmIyM2E4YjQ5NWNiOTcxYzlhNGQ2NDQ3YmUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjOTBhNDFjOTQxNzQ5ODdiZTU0OGI3ZTg3NzZmMDJmID0gJCgnPGRpdiBpZD0iaHRtbF81YzkwYTQxYzk0MTc0OTg3YmU1NDhiN2U4Nzc2ZjAyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjBmNDRiYjIzYThiNDk1Y2I5NzFjOWE0ZDY0NDdiZTIuc2V0Q29udGVudChodG1sXzVjOTBhNDFjOTQxNzQ5ODdiZTU0OGI3ZTg3NzZmMDJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4OTE4N2FkYWFmODQxZTI4OWQ4ZTYyN2I3NGQxYmI0LmJpbmRQb3B1cChwb3B1cF82MGY0NGJiMjNhOGI0OTVjYjk3MWM5YTRkNjQ0N2JlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYzUyMTk4YTJjNTI0Y2FjOTlhOTAyNjNkYjNhYzNmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1YzBkYWRlNWYyYTQ0NzFiODgyNThjZGEzOWNjZDdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiNDA0MjU5ZWZiMzQzYmZhY2NlZWU2NzJlZTYxNDk1ID0gJCgnPGRpdiBpZD0iaHRtbF82YjQwNDI1OWVmYjM0M2JmYWNjZWVlNjcyZWU2MTQ5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1YzBkYWRlNWYyYTQ0NzFiODgyNThjZGEzOWNjZDdmLnNldENvbnRlbnQoaHRtbF82YjQwNDI1OWVmYjM0M2JmYWNjZWVlNjcyZWU2MTQ5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYzUyMTk4YTJjNTI0Y2FjOTlhOTAyNjNkYjNhYzNmZC5iaW5kUG9wdXAocG9wdXBfZTVjMGRhZGU1ZjJhNDQ3MWI4ODI1OGNkYTM5Y2NkN2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTc2NTE5YzI2YzkwNGVmZTk2NzFhNGQzY2NmYzQ4ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmNWRjOTMwZDMxZTRmZmViMTMzYTdlMmU4YzA0NzQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiOTkwYTAxZWI4MzRjMzliMTU5NzIyNTgzNTI2NzQ2ID0gJCgnPGRpdiBpZD0iaHRtbF9jYjk5MGEwMWViODM0YzM5YjE1OTcyMjU4MzUyNjc0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY1ZGM5MzBkMzFlNGZmZWIxMzNhN2UyZThjMDQ3NDUuc2V0Q29udGVudChodG1sX2NiOTkwYTAxZWI4MzRjMzliMTU5NzIyNTgzNTI2NzQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3NjUxOWMyNmM5MDRlZmU5NjcxYTRkM2NjZmM0OGYzLmJpbmRQb3B1cChwb3B1cF9hZjVkYzkzMGQzMWU0ZmZlYjEzM2E3ZTJlOGMwNDc0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kODMzMDIxYTlhZDE0N2FkYTQyMzUwMDE2YjEwZTQ3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1ZTZhOWE3M2I4YjQ3OWU5YTkzZTI1NTc4ZTQzOTFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmMWFhNDgzNWNmMjRiZDliMjBkZmZiZTc1MjI0MzI3ID0gJCgnPGRpdiBpZD0iaHRtbF84ZjFhYTQ4MzVjZjI0YmQ5YjIwZGZmYmU3NTIyNDMyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjVlNmE5YTczYjhiNDc5ZTlhOTNlMjU1NzhlNDM5MWIuc2V0Q29udGVudChodG1sXzhmMWFhNDgzNWNmMjRiZDliMjBkZmZiZTc1MjI0MzI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q4MzMwMjFhOWFkMTQ3YWRhNDIzNTAwMTZiMTBlNDdkLmJpbmRQb3B1cChwb3B1cF9iNWU2YTlhNzNiOGI0NzllOWE5M2UyNTU3OGU0MzkxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMTZkZDNkMDc3MjY0ZGFlYmYxNTU1ZTNkM2NkMGQxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNjAxYzg4NzAzNjE0NTYzYWVkNTRlZmU2YWJkZjE2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTM5YjBiNTRiYjc0YWZjYTlhZmRhY2E5MGZjOWMxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmUzOWIwYjU0YmI3NGFmY2E5YWZkYWNhOTBmYzljMTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjYwMWM4ODcwMzYxNDU2M2FlZDU0ZWZlNmFiZGYxNjQuc2V0Q29udGVudChodG1sX2JlMzliMGI1NGJiNzRhZmNhOWFmZGFjYTkwZmM5YzEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxNmRkM2QwNzcyNjRkYWViZjE1NTVlM2QzY2QwZDFmLmJpbmRQb3B1cChwb3B1cF9iNjAxYzg4NzAzNjE0NTYzYWVkNTRlZmU2YWJkZjE2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZGU4ZjBmODNjZWY0YTNlOWIzMGU3MDRkOGUxYmZhOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOTBmOGFhNTRiNWM0MDkxYjk5NmEwZWZmMGUxMWI1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZTJlMDdmNzQyY2I0OGViODVlMTUwZWI2YzkzOGI0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGUyZTA3Zjc0MmNiNDhlYjg1ZTE1MGViNmM5MzhiNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkwZjhhYTU0YjVjNDA5MWI5OTZhMGVmZjBlMTFiNTEuc2V0Q29udGVudChodG1sXzBlMmUwN2Y3NDJjYjQ4ZWI4NWUxNTBlYjZjOTM4YjQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkZThmMGY4M2NlZjRhM2U5YjMwZTcwNGQ4ZTFiZmE5LmJpbmRQb3B1cChwb3B1cF9lOTBmOGFhNTRiNWM0MDkxYjk5NmEwZWZmMGUxMWI1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZDAyZjQxNDMwOWU0YWM2OTE5ZmVjYjcwNjU3MjdhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDQ4YjMxZjU1MzA0YmYwODYzMjdhNDY1ZDE3MTVjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjI5MWNjZjEwNGI0Y2MyYjZhOTRhNTUxYTJkZmNjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzYyOTFjY2YxMDRiNGNjMmI2YTk0YTU1MWEyZGZjYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMDQ4YjMxZjU1MzA0YmYwODYzMjdhNDY1ZDE3MTVjNi5zZXRDb250ZW50KGh0bWxfMzYyOTFjY2YxMDRiNGNjMmI2YTk0YTU1MWEyZGZjYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGQwMmY0MTQzMDllNGFjNjkxOWZlY2I3MDY1NzI3YWIuYmluZFBvcHVwKHBvcHVwX2IwNDhiMzFmNTUzMDRiZjA4NjMyN2E0NjVkMTcxNWM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwOWJiMThkZTQ1NDQ0NDQ4YzM1YzQ3MzAxYzc1Mzc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTk3MGIwNDFkMDk5NDk2MGE5YjAzY2VjOWI0YjJiYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTY1NzI1Njg0ZjA1NDdiY2I2MmRjNzNmNmViYmI0NTEgPSAkKCc8ZGl2IGlkPSJodG1sXzU2NTcyNTY4NGYwNTQ3YmNiNjJkYzczZjZlYmJiNDUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81OTcwYjA0MWQwOTk0OTYwYTliMDNjZWM5YjRiMmJhYy5zZXRDb250ZW50KGh0bWxfNTY1NzI1Njg0ZjA1NDdiY2I2MmRjNzNmNmViYmI0NTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDA5YmIxOGRlNDU0NDQ0NDhjMzVjNDczMDFjNzUzNzguYmluZFBvcHVwKHBvcHVwXzU5NzBiMDQxZDA5OTQ5NjBhOWIwM2NlYzliNGIyYmFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UyMWZhOGZkMjMzODRlNzBiMTNlZGU5MTY5ZjEyZDVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNzc3OTZiM2U2ODA0YzkyOWNkZWJmZGM2MzIxNjMyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDRkNWZiNTZhNTQ0MWFmOGQzNDRkN2JkMTBlZDc2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQ0ZDVmYjU2YTU0NDFhZjhkMzQ0ZDdiZDEwZWQ3NjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzc3OTZiM2U2ODA0YzkyOWNkZWJmZGM2MzIxNjMyMS5zZXRDb250ZW50KGh0bWxfNWQ0ZDVmYjU2YTU0NDFhZjhkMzQ0ZDdiZDEwZWQ3NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTIxZmE4ZmQyMzM4NGU3MGIxM2VkZTkxNjlmMTJkNWEuYmluZFBvcHVwKHBvcHVwX2I3Nzc5NmIzZTY4MDRjOTI5Y2RlYmZkYzYzMjE2MzIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EzY2UwZjg1OWEzZTRjNjRiMTM3YjIzODhhNWZkMzhjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDNlMGVlYmUxYTRkNDJhODgzY2U0MTg5Y2RhNGQxMGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDIxOGI1NzRjYTMzNDkxMzk1MjBkZjJlOWIxOTRiMjEgPSAkKCc8ZGl2IGlkPSJodG1sX2QyMThiNTc0Y2EzMzQ5MTM5NTIwZGYyZTliMTk0YjIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzZTBlZWJlMWE0ZDQyYTg4M2NlNDE4OWNkYTRkMTBkLnNldENvbnRlbnQoaHRtbF9kMjE4YjU3NGNhMzM0OTEzOTUyMGRmMmU5YjE5NGIyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hM2NlMGY4NTlhM2U0YzY0YjEzN2IyMzg4YTVmZDM4Yy5iaW5kUG9wdXAocG9wdXBfZDNlMGVlYmUxYTRkNDJhODgzY2U0MTg5Y2RhNGQxMGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGU0NzY2MTcwMmYyNDIzMTg5MGE1MmM2MWY4ZjM3ODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODI0YjY1YTNhNGM0MWU5YTJhNDQwYzkxNzkyN2VlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YTc2ZDA5YjRmMWE0NjUxOGJjYjk5Mjg1NjEyMDRjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNGE3NmQwOWI0ZjFhNDY1MThiY2I5OTI4NTYxMjA0YzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODI0YjY1YTNhNGM0MWU5YTJhNDQwYzkxNzkyN2VlNi5zZXRDb250ZW50KGh0bWxfNGE3NmQwOWI0ZjFhNDY1MThiY2I5OTI4NTYxMjA0YzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGU0NzY2MTcwMmYyNDIzMTg5MGE1MmM2MWY4ZjM3ODIuYmluZFBvcHVwKHBvcHVwXzk4MjRiNjVhM2E0YzQxZTlhMmE0NDBjOTE3OTI3ZWU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjODg0MjJlMTkxNDQxZWQ4NTA2ZDY2YWFjMDQ4MmRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzMDEzYWY1NzY2YTRiMzNhN2YwMzg4MmVlODM1NzEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZjYzg3MThkM2I4YzQ0MjRiODk1MjNlMDlmNjdjY2M1ID0gJCgnPGRpdiBpZD0iaHRtbF82Y2M4NzE4ZDNiOGM0NDI0Yjg5NTIzZTA5ZjY3Y2NjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDMwMTNhZjU3NjZhNGIzM2E3ZjAzODgyZWU4MzU3MTMuc2V0Q29udGVudChodG1sXzZjYzg3MThkM2I4YzQ0MjRiODk1MjNlMDlmNjdjY2M1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjODg0MjJlMTkxNDQxZWQ4NTA2ZDY2YWFjMDQ4MmRhLmJpbmRQb3B1cChwb3B1cF80MzAxM2FmNTc2NmE0YjMzYTdmMDM4ODJlZTgzNTcxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDc3MmY4NjM5YWY0YjgwODFlOGFiZWFjNjI0YTQwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMThhYjViMDBiMDY1NDBmZWI5NzJmNGYyMmZiNTViNzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGI3YjlmZmFkMTIwNDMwNTg3NWMwOTE1NWIzMjg3ZDQgPSAkKCc8ZGl2IGlkPSJodG1sXzRiN2I5ZmZhZDEyMDQzMDU4NzVjMDkxNTViMzI4N2Q0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMThhYjViMDBiMDY1NDBmZWI5NzJmNGYyMmZiNTViNzIuc2V0Q29udGVudChodG1sXzRiN2I5ZmZhZDEyMDQzMDU4NzVjMDkxNTViMzI4N2Q0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0NzcyZjg2MzlhZjRiODA4MWU4YWJlYWM2MjRhNDA1LmJpbmRQb3B1cChwb3B1cF8xOGFiNWIwMGIwNjU0MGZlYjk3MmY0ZjIyZmI1NWI3Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTYyN2EwODFhMzM0ZDI3OGNmYTE2YzQ1ZTMwOWVjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYWQwYjg2N2MyN2U0MDY4ODcwNWFkZmZlMjAwMjIxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NTFmYjdmNzI1NWI0YmY5YmVlYjU1NDk3NmVhMDQ2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTUxZmI3ZjcyNTViNGJmOWJlZWI1NTQ5NzZlYTA0NjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhZDBiODY3YzI3ZTQwNjg4NzA1YWRmZmUyMDAyMjFlLnNldENvbnRlbnQoaHRtbF85NTFmYjdmNzI1NWI0YmY5YmVlYjU1NDk3NmVhMDQ2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZTYyN2EwODFhMzM0ZDI3OGNmYTE2YzQ1ZTMwOWVjMS5iaW5kUG9wdXAocG9wdXBfYmFkMGI4NjdjMjdlNDA2ODg3MDVhZGZmZTIwMDIyMWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODhhM2YzNzU1NzQwNDg1Njk0Y2E3YzU0ZTBjNzZjNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTIzNWEwZGNkMThhNDY4OGFlMDk2MDM5ZjlmMWQ3ZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjRmYjkxMTE0MWVhNGY3YmJmYzEzNmNhOTA2NjgyOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzY0ZmI5MTExNDFlYTRmN2JiZmMxMzZjYTkwNjY4Mjk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTIzNWEwZGNkMThhNDY4OGFlMDk2MDM5ZjlmMWQ3ZmMuc2V0Q29udGVudChodG1sXzY0ZmI5MTExNDFlYTRmN2JiZmMxMzZjYTkwNjY4Mjk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg4YTNmMzc1NTc0MDQ4NTY5NGNhN2M1NGUwYzc2YzQ5LmJpbmRQb3B1cChwb3B1cF9hMjM1YTBkY2QxOGE0Njg4YWUwOTYwMzlmOWYxZDdmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZDVmM2M0MTZhYjY0MTVkOGI3YjM4ZmFkNTQ4NDQwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjRiYWNmNDVjZmNjNDRhZGE5NjRjNzA0YzhjMjUwOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTViOTc3MGY1ZmFjNGM5M2I2Yjg3MDFiNzdhM2Q0YzQgPSAkKCc8ZGl2IGlkPSJodG1sXzE1Yjk3NzBmNWZhYzRjOTNiNmI4NzAxYjc3YTNkNGM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0YmFjZjQ1Y2ZjYzQ0YWRhOTY0YzcwNGM4YzI1MDkyLnNldENvbnRlbnQoaHRtbF8xNWI5NzcwZjVmYWM0YzkzYjZiODcwMWI3N2EzZDRjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZDVmM2M0MTZhYjY0MTVkOGI3YjM4ZmFkNTQ4NDQwNS5iaW5kUG9wdXAocG9wdXBfYjRiYWNmNDVjZmNjNDRhZGE5NjRjNzA0YzhjMjUwOTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU1NWYzMjBkNjQ1NDYzNmE0YmQ5NGUxMWRiOWI1YTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVjODg2NTRmN2JlNGY5ZTg1OWUzZTI3YmFhMDZjYWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmYxOThiZjMxYTM4NDAzZGFhZWExNzIyODNkOTQwYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzZmMTk4YmYzMWEzODQwM2RhYWVhMTcyMjgzZDk0MGJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlYzg4NjU0ZjdiZTRmOWU4NTllM2UyN2JhYTA2Y2FmLnNldENvbnRlbnQoaHRtbF82ZjE5OGJmMzFhMzg0MDNkYWFlYTE3MjI4M2Q5NDBiZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZTU1ZjMyMGQ2NDU0NjM2YTRiZDk0ZTExZGI5YjVhOC5iaW5kUG9wdXAocG9wdXBfYmVjODg2NTRmN2JlNGY5ZTg1OWUzZTI3YmFhMDZjYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmRlZDE5NzVmNzY5NDg0NjlmZWEyMzQyYWEyZjRlOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZWZmMWMyYTAzN2E0MWU0ODEzZWVhMGRhMTZkNmUzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YWQxYWU3MDY4YmI0MWI5ODBkYzMwZTUyM2Y5NzViNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNGFkMWFlNzA2OGJiNDFiOTgwZGMzMGU1MjNmOTc1YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZWZmMWMyYTAzN2E0MWU0ODEzZWVhMGRhMTZkNmUzMC5zZXRDb250ZW50KGh0bWxfNGFkMWFlNzA2OGJiNDFiOTgwZGMzMGU1MjNmOTc1YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRlZDE5NzVmNzY5NDg0NjlmZWEyMzQyYWEyZjRlOTYuYmluZFBvcHVwKHBvcHVwXzZlZmYxYzJhMDM3YTQxZTQ4MTNlZWEwZGExNmQ2ZTMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2NWIxZmQwYWFmYzRkMGRiMDJmMTdiN2VhYmVkMGVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzZlNjgwZDcyODdmNDY0OGJlODg3ODNlZDQ3YzM3NzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWYyNzg2MTBkNWQ3NGJkMWJlMDM3ZmY0MWM5YjQyMjYgPSAkKCc8ZGl2IGlkPSJodG1sX2FmMjc4NjEwZDVkNzRiZDFiZTAzN2ZmNDFjOWI0MjI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NmU2ODBkNzI4N2Y0NjQ4YmU4ODc4M2VkNDdjMzc3MC5zZXRDb250ZW50KGh0bWxfYWYyNzg2MTBkNWQ3NGJkMWJlMDM3ZmY0MWM5YjQyMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODY1YjFmZDBhYWZjNGQwZGIwMmYxN2I3ZWFiZWQwZWYuYmluZFBvcHVwKHBvcHVwXzc2ZTY4MGQ3Mjg3ZjQ2NDhiZTg4NzgzZWQ0N2MzNzcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyYWFmMDkyYmQzNjQyMTU4M2Y2MTYxNWE2NGNmZTQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNzliYjUxZTRkYTU0MDlmODk4ZDY5MGMxMzBiMTc4NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YjA0OTFhOWVmYjA0N2NkYmRiM2E1NDI2ZGRiM2Q4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfOWIwNDkxYTllZmIwNDdjZGJkYjNhNTQyNmRkYjNkODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNzliYjUxZTRkYTU0MDlmODk4ZDY5MGMxMzBiMTc4NS5zZXRDb250ZW50KGh0bWxfOWIwNDkxYTllZmIwNDdjZGJkYjNhNTQyNmRkYjNkODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzJhYWYwOTJiZDM2NDIxNTgzZjYxNjE1YTY0Y2ZlNDcuYmluZFBvcHVwKHBvcHVwX2U3OWJiNTFlNGRhNTQwOWY4OThkNjkwYzEzMGIxNzg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkM2M0ZTlhODRiZDQzODJiZDExOGZlOWZmMmY4NmYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhYzJhMWRiZmE4ZDQ4ZTBhZTBiN2E5YjEwZDE1ZWY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlNzZkYTkyZGM5MDRhYjE5ZjNiMGUwM2MwYTU4ZmEyID0gJCgnPGRpdiBpZD0iaHRtbF83ZTc2ZGE5MmRjOTA0YWIxOWYzYjBlMDNjMGE1OGZhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhYzJhMWRiZmE4ZDQ4ZTBhZTBiN2E5YjEwZDE1ZWY4LnNldENvbnRlbnQoaHRtbF83ZTc2ZGE5MmRjOTA0YWIxOWYzYjBlMDNjMGE1OGZhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZDNjNGU5YTg0YmQ0MzgyYmQxMThmZTlmZjJmODZmMS5iaW5kUG9wdXAocG9wdXBfNGFjMmExZGJmYThkNDhlMGFlMGI3YTliMTBkMTVlZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDk5MjcwMjMyYWIwNGEzMWI5ZDNkYTIwM2U2ZjU4ZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmE1NjljMTcyNzcyNGFlN2IxM2MxYjRhNWQ3N2RiNjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzcxZmI5ZTRmMzBkNDMwYWFkZmQ2ZGJkYzg2NDc3M2IgPSAkKCc8ZGl2IGlkPSJodG1sXzM3MWZiOWU0ZjMwZDQzMGFhZGZkNmRiZGM4NjQ3NzNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmE1NjljMTcyNzcyNGFlN2IxM2MxYjRhNWQ3N2RiNjYuc2V0Q29udGVudChodG1sXzM3MWZiOWU0ZjMwZDQzMGFhZGZkNmRiZGM4NjQ3NzNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q5OTI3MDIzMmFiMDRhMzFiOWQzZGEyMDNlNmY1OGQ0LmJpbmRQb3B1cChwb3B1cF82YTU2OWMxNzI3NzI0YWU3YjEzYzFiNGE1ZDc3ZGI2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMmEyMGIzODc0MWI0NDZmYmZhMThmNzNkZDkyNzBkZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQ4MzAxNGQwMzJiNDEwZWIwYWNjZjcyNTY3ZDczNzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjFjZjYxYWY0NTVkNGNiNTkwMWIyMjVkOWY3MTY4ZTkgPSAkKCc8ZGl2IGlkPSJodG1sXzYxY2Y2MWFmNDU1ZDRjYjU5MDFiMjI1ZDlmNzE2OGU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDgzMDE0ZDAzMmI0MTBlYjBhY2NmNzI1NjdkNzM3NS5zZXRDb250ZW50KGh0bWxfNjFjZjYxYWY0NTVkNGNiNTkwMWIyMjVkOWY3MTY4ZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjJhMjBiMzg3NDFiNDQ2ZmJmYTE4ZjczZGQ5MjcwZGYuYmluZFBvcHVwKHBvcHVwXzk0ODMwMTRkMDMyYjQxMGViMGFjY2Y3MjU2N2Q3Mzc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlODJmNDRkNjkwNzRiNjZhODliNGQ2ODY0ZDhmMjZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4ODNkOWFhMTliOTRmNDE5MWE4MTg4MGYyNDQ5M2Y0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyY2E0NGNmMmQ4ODQyMjM5MTFjMDZkZThlNDRhYjM0ID0gJCgnPGRpdiBpZD0iaHRtbF80MmNhNDRjZjJkODg0MjIzOTExYzA2ZGU4ZTQ0YWIzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4ODNkOWFhMTliOTRmNDE5MWE4MTg4MGYyNDQ5M2Y0LnNldENvbnRlbnQoaHRtbF80MmNhNDRjZjJkODg0MjIzOTExYzA2ZGU4ZTQ0YWIzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZTgyZjQ0ZDY5MDc0YjY2YTg5YjRkNjg2NGQ4ZjI2YS5iaW5kUG9wdXAocG9wdXBfMzg4M2Q5YWExOWI5NGY0MTkxYTgxODgwZjI0NDkzZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDgxM2Y5MjljNDM5NGI2Yzg4Mjg4YzJmMDMzZGRmN2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjY2JkMjFjNmQzNTRkZDNiZGJiNDhhYmU3MTExZjY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4NzJiNDBiZDVkYzQ2NGZhZGY1YTQ4Njk2NjE5MTQ1ID0gJCgnPGRpdiBpZD0iaHRtbF9jODcyYjQwYmQ1ZGM0NjRmYWRmNWE0ODY5NjYxOTE0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NjYmQyMWM2ZDM1NGRkM2JkYmI0OGFiZTcxMTFmNjguc2V0Q29udGVudChodG1sX2M4NzJiNDBiZDVkYzQ2NGZhZGY1YTQ4Njk2NjE5MTQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA4MTNmOTI5YzQzOTRiNmM4ODI4OGMyZjAzM2RkZjdkLmJpbmRQb3B1cChwb3B1cF83Y2NiZDIxYzZkMzU0ZGQzYmRiYjQ4YWJlNzExMWY2OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Yzk0YmNkNzc5NTA0NmZjOTUwZTZjYmY2MGJmNDg2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MGU3Nzk1YzIyMDc0MDQxYmJkMzEzYzAzY2NhNjllMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTcxN2VkYTI1YTc0MDY3YmQ5ODUzMmQxZWFiNmUxNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzU3MTdlZGEyNWE3NDA2N2JkOTg1MzJkMWVhYjZlMTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MGU3Nzk1YzIyMDc0MDQxYmJkMzEzYzAzY2NhNjllMS5zZXRDb250ZW50KGh0bWxfMzU3MTdlZGEyNWE3NDA2N2JkOTg1MzJkMWVhYjZlMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGM5NGJjZDc3OTUwNDZmYzk1MGU2Y2JmNjBiZjQ4NjEuYmluZFBvcHVwKHBvcHVwXzQwZTc3OTVjMjIwNzQwNDFiYmQzMTNjMDNjY2E2OWUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmMGMxYWVhNjJmYzRiNzlhMTA0MWYwMzM3MDM1MzJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWYwYjAyNTJlZmUzNDQ2MjhkODcxNDZiYjZmZmRmOGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTM1MzZkZDVhNjM3NGNmY2FmYjI1MDc0ZGQwYzEzNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzEzNTM2ZGQ1YTYzNzRjZmNhZmIyNTA3NGRkMGMxMzY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmMGIwMjUyZWZlMzQ0NjI4ZDg3MTQ2YmI2ZmZkZjhmLnNldENvbnRlbnQoaHRtbF8xMzUzNmRkNWE2Mzc0Y2ZjYWZiMjUwNzRkZDBjMTM2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjBjMWFlYTYyZmM0Yjc5YTEwNDFmMDMzNzAzNTMyZS5iaW5kUG9wdXAocG9wdXBfYWYwYjAyNTJlZmUzNDQ2MjhkODcxNDZiYjZmZmRmOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWM4M2YyZjBiZDA5NDIxM2FlNWMxMTdmNDFiYjQ1NzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2MzQ3OWYxMDFmZjRmYmViNDIyNTJlNDNjOTk1YTkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMxOGMxNTMzZTBjNzQ2YzZiM2NhODk3ZDI5MTc5NGQ1ID0gJCgnPGRpdiBpZD0iaHRtbF8zMThjMTUzM2UwYzc0NmM2YjNjYTg5N2QyOTE3OTRkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNjM0NzlmMTAxZmY0ZmJlYjQyMjUyZTQzYzk5NWE5Mi5zZXRDb250ZW50KGh0bWxfMzE4YzE1MzNlMGM3NDZjNmIzY2E4OTdkMjkxNzk0ZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWM4M2YyZjBiZDA5NDIxM2FlNWMxMTdmNDFiYjQ1NzYuYmluZFBvcHVwKHBvcHVwXzI2MzQ3OWYxMDFmZjRmYmViNDIyNTJlNDNjOTk1YTkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0OTRhZmZjZmU5NDRiY2E4MTU4ZGRkNDU5NjA5YWMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwNzUyOGZlNjM3MzRlZTZhZmM5ZGYzNTE1NTQyZDBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiZjcxYzAwYmQ1NzQyOTE4NjIzNWU5MDFiMmZlZDlmID0gJCgnPGRpdiBpZD0iaHRtbF9jYmY3MWMwMGJkNTc0MjkxODYyMzVlOTAxYjJmZWQ5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwNzUyOGZlNjM3MzRlZTZhZmM5ZGYzNTE1NTQyZDBiLnNldENvbnRlbnQoaHRtbF9jYmY3MWMwMGJkNTc0MjkxODYyMzVlOTAxYjJmZWQ5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NDk0YWZmY2ZlOTQ0YmNhODE1OGRkZDQ1OTYwOWFjMS5iaW5kUG9wdXAocG9wdXBfNDA3NTI4ZmU2MzczNGVlNmFmYzlkZjM1MTU1NDJkMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWM4OTdmYmYxYWYyNDMxY2JkNDhjYjk0ZjU2MzQwNGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiODhjMWEwZWI5MjQ3NTE4OGY4M2JmZTI2Y2U2ODgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1NTlhMDY0Y2MxMjRjYTNhZmNiY2MwZWUzMmMyZTgxID0gJCgnPGRpdiBpZD0iaHRtbF9mNTU5YTA2NGNjMTI0Y2EzYWZjYmNjMGVlMzJjMmU4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjg4YzFhMGViOTI0NzUxODhmODNiZmUyNmNlNjg4MS5zZXRDb250ZW50KGh0bWxfZjU1OWEwNjRjYzEyNGNhM2FmY2JjYzBlZTMyYzJlODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWM4OTdmYmYxYWYyNDMxY2JkNDhjYjk0ZjU2MzQwNGYuYmluZFBvcHVwKHBvcHVwXzNiODhjMWEwZWI5MjQ3NTE4OGY4M2JmZTI2Y2U2ODgxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViMTRjY2Q5ZTI3NTRkZGM5YWY0NTQwNjU5OGEyOGE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhMDdiNzA0ODE4ZDQ2MzhhYzQ0YWUzZTQxNmZiZjQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllNWJhZjkzMzA3ZjQwOWU5N2M5YjlmYTE2MTdmMTMzID0gJCgnPGRpdiBpZD0iaHRtbF85ZTViYWY5MzMwN2Y0MDllOTdjOWI5ZmExNjE3ZjEzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTA3YjcwNDgxOGQ0NjM4YWM0NGFlM2U0MTZmYmY0Ny5zZXRDb250ZW50KGh0bWxfOWU1YmFmOTMzMDdmNDA5ZTk3YzliOWZhMTYxN2YxMzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWIxNGNjZDllMjc1NGRkYzlhZjQ1NDA2NTk4YTI4YTkuYmluZFBvcHVwKHBvcHVwX2RhMDdiNzA0ODE4ZDQ2MzhhYzQ0YWUzZTQxNmZiZjQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYzNzBjZjQ1M2MyNzRiMjg4NjE4ODVlMTBkODkxNDExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFkYjVhOGM3N2EzMzRmMTM5ZjRjYzY4MmZlOTVhMjJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhYjI4OWFiODk0MDQ1OWU4MmUzZmZiNGQ1NTgyNWE5ID0gJCgnPGRpdiBpZD0iaHRtbF8wYWIyODlhYjg5NDA0NTllODJlM2ZmYjRkNTU4MjVhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkYjVhOGM3N2EzMzRmMTM5ZjRjYzY4MmZlOTVhMjJkLnNldENvbnRlbnQoaHRtbF8wYWIyODlhYjg5NDA0NTllODJlM2ZmYjRkNTU4MjVhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MzcwY2Y0NTNjMjc0YjI4ODYxODg1ZTEwZDg5MTQxMS5iaW5kUG9wdXAocG9wdXBfMWRiNWE4Yzc3YTMzNGYxMzlmNGNjNjgyZmU5NWEyMmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTcyODVhN2U2ODExNDIxOTk3ZWUxYTBkMmJkYWZiYzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiM2I4MDQzNzEzNjRlYjFiZTc0NDlkNDA5N2NhNDZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyNzZhNzdjZDA5MDQ5ZjliMDBmMDFiNzFlZjgzODBmID0gJCgnPGRpdiBpZD0iaHRtbF9jMjc2YTc3Y2QwOTA0OWY5YjAwZjAxYjcxZWY4MzgwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjNiODA0MzcxMzY0ZWIxYmU3NDQ5ZDQwOTdjYTQ2Zi5zZXRDb250ZW50KGh0bWxfYzI3NmE3N2NkMDkwNDlmOWIwMGYwMWI3MWVmODM4MGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTcyODVhN2U2ODExNDIxOTk3ZWUxYTBkMmJkYWZiYzIuYmluZFBvcHVwKHBvcHVwXzhiM2I4MDQzNzEzNjRlYjFiZTc0NDlkNDA5N2NhNDZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0OTI4YmI0NjI1ODQ2Y2RhM2U3NTdkYjgxNWQ4YmRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UyOGQ4YTQxMGZhYTQxOTJhOGYwZjJhN2RlNWE4ZmVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlZjY4MjhmY2M4NzQ2ZDViYzVjMjU3YjNjNzY2ZDk5ID0gJCgnPGRpdiBpZD0iaHRtbF8yZWY2ODI4ZmNjODc0NmQ1YmM1YzI1N2IzYzc2NmQ5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjhkOGE0MTBmYWE0MTkyYThmMGYyYTdkZTVhOGZlYy5zZXRDb250ZW50KGh0bWxfMmVmNjgyOGZjYzg3NDZkNWJjNWMyNTdiM2M3NjZkOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTQ5MjhiYjQ2MjU4NDZjZGEzZTc1N2RiODE1ZDhiZGEuYmluZFBvcHVwKHBvcHVwX2UyOGQ4YTQxMGZhYTQxOTJhOGYwZjJhN2RlNWE4ZmVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3MTBkMTUwOGE4MzRhMjU5YmVlZmEwNjZkNWYzOWRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Njk2YTg5OGZlNDk0NTdjYmEyYTY2ZTNlMGI0MzI3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOTRhYmUwNzc2YWM0MjdkYThiNGFhOTVhYTEwYTMyMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjk0YWJlMDc3NmFjNDI3ZGE4YjRhYTk1YWExMGEzMjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Njk2YTg5OGZlNDk0NTdjYmEyYTY2ZTNlMGI0MzI3Yy5zZXRDb250ZW50KGh0bWxfMjk0YWJlMDc3NmFjNDI3ZGE4YjRhYTk1YWExMGEzMjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDcxMGQxNTA4YTgzNGEyNTliZWVmYTA2NmQ1ZjM5ZGQuYmluZFBvcHVwKHBvcHVwXzU2OTZhODk4ZmU0OTQ1N2NiYTJhNjZlM2UwYjQzMjdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllNDZhMjY2YjdiMzRiODViYmNiNzRiN2NkNGQxYWYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDdjNjkwMzcxMTA0NDg4Njk5ODIyNDc2MmE4ODQzMGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODM0ZmY2MjE5MzFhNDQ2Yjk4NDRjNTc5YmE3ZjZjYTEgPSAkKCc8ZGl2IGlkPSJodG1sXzgzNGZmNjIxOTMxYTQ0NmI5ODQ0YzU3OWJhN2Y2Y2ExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDdjNjkwMzcxMTA0NDg4Njk5ODIyNDc2MmE4ODQzMGQuc2V0Q29udGVudChodG1sXzgzNGZmNjIxOTMxYTQ0NmI5ODQ0YzU3OWJhN2Y2Y2ExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllNDZhMjY2YjdiMzRiODViYmNiNzRiN2NkNGQxYWYzLmJpbmRQb3B1cChwb3B1cF80N2M2OTAzNzExMDQ0ODg2OTk4MjI0NzYyYTg4NDMwZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MDM2MTk3MDJjOWQ0NmY4YTE2MGQ1MzE2NDliMzlkMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYjU3ZjBkYzkyYjk0ZjBjYTQ5ZDVhZjY0MjUyZmI2YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjUyNGJhYmE4NGU0N2Q5YjljOWJkYjU1ZjgxNmYxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjI1MjRiYWJhODRlNDdkOWI5YzliZGI1NWY4MTZmMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYjU3ZjBkYzkyYjk0ZjBjYTQ5ZDVhZjY0MjUyZmI2Yy5zZXRDb250ZW50KGh0bWxfMjI1MjRiYWJhODRlNDdkOWI5YzliZGI1NWY4MTZmMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTAzNjE5NzAyYzlkNDZmOGExNjBkNTMxNjQ5YjM5ZDAuYmluZFBvcHVwKHBvcHVwX2ZiNTdmMGRjOTJiOTRmMGNhNDlkNWFmNjQyNTJmYjZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMxZmZjOWY1NWJlOTRlMzBiYTEyNWQwMzZjZDI4NTA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZTViOTYyZGNkYWU0YWQ3ODAyYzg2MWQ4ODhjNGJlOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMjE2MTcyMTg5ZWM0Yjg5ODcyYjkzOWYyNDgxOTM3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzIxNjE3MjE4OWVjNGI4OTg3MmI5MzlmMjQ4MTkzNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWU1Yjk2MmRjZGFlNGFkNzgwMmM4NjFkODg4YzRiZTguc2V0Q29udGVudChodG1sXzMyMTYxNzIxODllYzRiODk4NzJiOTM5ZjI0ODE5Mzc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxZmZjOWY1NWJlOTRlMzBiYTEyNWQwMzZjZDI4NTA0LmJpbmRQb3B1cChwb3B1cF9hZTViOTYyZGNkYWU0YWQ3ODAyYzg2MWQ4ODhjNGJlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYjI5NDRlYzE1MTg0MWI0YWY4MDIxMDAyZTA1ZDY1ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80N2NmYzFjNjdhZDA0NGExOWIzNDAyNDU5MGE5ZmVlOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTRjNmZkOTM1OWU0MGI3OGM1MmEyMGRhMGFmMmNjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzE0YzZmZDkzNTllNDBiNzhjNTJhMjBkYTBhZjJjY2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3Y2ZjMWM2N2FkMDQ0YTE5YjM0MDI0NTkwYTlmZWU4LnNldENvbnRlbnQoaHRtbF83MTRjNmZkOTM1OWU0MGI3OGM1MmEyMGRhMGFmMmNjZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYjI5NDRlYzE1MTg0MWI0YWY4MDIxMDAyZTA1ZDY1Zi5iaW5kUG9wdXAocG9wdXBfNDdjZmMxYzY3YWQwNDRhMTliMzQwMjQ1OTBhOWZlZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTM3NTEzN2MyOWMzNGU1OWE4N2EzMmI0MzUwZjk4MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGM5ZTlhNTljZTI3NGY2YzkyMTdiNWNjODgzZDBjYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWZlMGY4MTI1NGZhNDM0MGJmNTI5ZDM3ZDBiMjk2OGEgPSAkKCc8ZGl2IGlkPSJodG1sXzVmZTBmODEyNTRmYTQzNDBiZjUyOWQzN2QwYjI5NjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YzllOWE1OWNlMjc0ZjZjOTIxN2I1Y2M4ODNkMGNhOC5zZXRDb250ZW50KGh0bWxfNWZlMGY4MTI1NGZhNDM0MGJmNTI5ZDM3ZDBiMjk2OGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTM3NTEzN2MyOWMzNGU1OWE4N2EzMmI0MzUwZjk4MzAuYmluZFBvcHVwKHBvcHVwXzhjOWU5YTU5Y2UyNzRmNmM5MjE3YjVjYzg4M2QwY2E4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4Y2ZhMGIzMGQ0NjQ5NTJiOWY3MTg4NTM3NTFiZDcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0NjQ0YjJkYWQ1OTQ1NDc4MmM0ZjU2ZDdjYmI0ZTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkZDhiOTliNjFkNjRjMzY4MDQ1MTMzODEwNWNjYTcyID0gJCgnPGRpdiBpZD0iaHRtbF82ZGQ4Yjk5YjYxZDY0YzM2ODA0NTEzMzgxMDVjY2E3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0NjQ0YjJkYWQ1OTQ1NDc4MmM0ZjU2ZDdjYmI0ZTM4LnNldENvbnRlbnQoaHRtbF82ZGQ4Yjk5YjYxZDY0YzM2ODA0NTEzMzgxMDVjY2E3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOGNmYTBiMzBkNDY0OTUyYjlmNzE4ODUzNzUxYmQ3MC5iaW5kUG9wdXAocG9wdXBfNzQ2NDRiMmRhZDU5NDU0NzgyYzRmNTZkN2NiYjRlMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FmZDA5ZTRjZjg1NDgyZWIzMjAxYjI5NmZiZjgzZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDE0MjY3ZjlmNGZiNDk4ZWE1MzQyODExYzhhMDA0YmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmUwMWY4MTU0NjllNDg0YThjNGQ0ZDA2MTcxNDg1MDkgPSAkKCc8ZGl2IGlkPSJodG1sX2JlMDFmODE1NDY5ZTQ4NGE4YzRkNGQwNjE3MTQ4NTA5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDE0MjY3ZjlmNGZiNDk4ZWE1MzQyODExYzhhMDA0YmIuc2V0Q29udGVudChodG1sX2JlMDFmODE1NDY5ZTQ4NGE4YzRkNGQwNjE3MTQ4NTA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhZmQwOWU0Y2Y4NTQ4MmViMzIwMWIyOTZmYmY4M2RmLmJpbmRQb3B1cChwb3B1cF8wMTQyNjdmOWY0ZmI0OThlYTUzNDI4MTFjOGEwMDRiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNDIwNGRmYjU1ZDM0NDI4ODBkZmFhNDI0ZGNkNGJjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjdkYzU2YTlmZmJlNDJkMzk5NmU2MzE1NDYyNDk2MWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjg3MDAzMGExYzFlNDY0NDg0NGM1MTZjZjUyMDlhZmEgPSAkKCc8ZGl2IGlkPSJodG1sX2I4NzAwMzBhMWMxZTQ2NDQ4NDRjNTE2Y2Y1MjA5YWZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdkYzU2YTlmZmJlNDJkMzk5NmU2MzE1NDYyNDk2MWEuc2V0Q29udGVudChodG1sX2I4NzAwMzBhMWMxZTQ2NDQ4NDRjNTE2Y2Y1MjA5YWZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0MjA0ZGZiNTVkMzQ0Mjg4MGRmYWE0MjRkY2Q0YmM5LmJpbmRQb3B1cChwb3B1cF9mN2RjNTZhOWZmYmU0MmQzOTk2ZTYzMTU0NjI0OTYxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NTMwOTE5MWFlNjM0MWNmYjhjZGY3YmQ4NTdiNzFiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmZlOTllOTE5YjQyNGQyOGI5MGU1MDE2OWVjNDIyM2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjNmYzMyYzA5MjNkNDNlNmE2NGNmNzEyZGM5YmE2ZmMgPSAkKCc8ZGl2IGlkPSJodG1sX2IzZmMzMmMwOTIzZDQzZTZhNjRjZjcxMmRjOWJhNmZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmZTk5ZTkxOWI0MjRkMjhiOTBlNTAxNjllYzQyMjNkLnNldENvbnRlbnQoaHRtbF9iM2ZjMzJjMDkyM2Q0M2U2YTY0Y2Y3MTJkYzliYTZmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NTMwOTE5MWFlNjM0MWNmYjhjZGY3YmQ4NTdiNzFiZC5iaW5kUG9wdXAocG9wdXBfNmZlOTllOTE5YjQyNGQyOGI5MGU1MDE2OWVjNDIyM2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDQwZjNiZmM5Yzg0NDExYjgwNTRiYTc3YjM0NDkzZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDRkNWFmYTI0OWRjNDRmNGJkNjc0MzcxY2I1OTExZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzk2ZjhhODlmZjk0NDc4ZDllMzA3M2RlOGEyOTVkZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzM5NmY4YTg5ZmY5NDQ3OGQ5ZTMwNzNkZThhMjk1ZGQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0ZDVhZmEyNDlkYzQ0ZjRiZDY3NDM3MWNiNTkxMWZkLnNldENvbnRlbnQoaHRtbF8zOTZmOGE4OWZmOTQ0NzhkOWUzMDczZGU4YTI5NWRkNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNDBmM2JmYzljODQ0MTFiODA1NGJhNzdiMzQ0OTNlYi5iaW5kUG9wdXAocG9wdXBfZDRkNWFmYTI0OWRjNDRmNGJkNjc0MzcxY2I1OTExZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWQwYmJiZGI3NzBkNDMzYmEwYWVhNzQ5NDM3ZmY5NDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDljYjIyMzIyNDkwNDhiMzk3MWJlYmYxOGRhZGQ4YjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q1NGRjNjgxNWFiNDdmNDhkNWM3ZTg5ZjE4YjE1YmUgPSAkKCc8ZGl2IGlkPSJodG1sX2NkNTRkYzY4MTVhYjQ3ZjQ4ZDVjN2U4OWYxOGIxNWJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOWNiMjIzMjI0OTA0OGIzOTcxYmViZjE4ZGFkZDhiMi5zZXRDb250ZW50KGh0bWxfY2Q1NGRjNjgxNWFiNDdmNDhkNWM3ZTg5ZjE4YjE1YmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWQwYmJiZGI3NzBkNDMzYmEwYWVhNzQ5NDM3ZmY5NDEuYmluZFBvcHVwKHBvcHVwXzA5Y2IyMjMyMjQ5MDQ4YjM5NzFiZWJmMThkYWRkOGIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExOTYzNTQxMDE5ODQ5NDdiMTM1MDZlMzgyYjYwYjM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzMDZkNTQzNWVjZjQwMGY5OTAwMmRjMGZhNjZhNWQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzYWM1YjA3NmUyNTRhYThhNGY2YTNhMTdjOWY5NDhjID0gJCgnPGRpdiBpZD0iaHRtbF8xM2FjNWIwNzZlMjU0YWE4YTRmNmEzYTE3YzlmOTQ4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MzA2ZDU0MzVlY2Y0MDBmOTkwMDJkYzBmYTY2YTVkMi5zZXRDb250ZW50KGh0bWxfMTNhYzViMDc2ZTI1NGFhOGE0ZjZhM2ExN2M5Zjk0OGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTE5NjM1NDEwMTk4NDk0N2IxMzUwNmUzODJiNjBiMzQuYmluZFBvcHVwKHBvcHVwXzQzMDZkNTQzNWVjZjQwMGY5OTAwMmRjMGZhNjZhNWQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1MDlhMzM4ZTRkYTQ3MTk4MDVhZDlmMGZmOTcyZTZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyMWZlZDZiZTA4MDQ5MGJhYTc3ZDBjYmI0NzZlMDc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EyMTg2YzlmNzFhZjRkZjJhYjQ4MjU5Y2UyMDg5ZDVjID0gJCgnPGRpdiBpZD0iaHRtbF9hMjE4NmM5ZjcxYWY0ZGYyYWI0ODI1OWNlMjA4OWQ1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODIxZmVkNmJlMDgwNDkwYmFhNzdkMGNiYjQ3NmUwNzQuc2V0Q29udGVudChodG1sX2EyMTg2YzlmNzFhZjRkZjJhYjQ4MjU5Y2UyMDg5ZDVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1MDlhMzM4ZTRkYTQ3MTk4MDVhZDlmMGZmOTcyZTZjLmJpbmRQb3B1cChwb3B1cF84MjFmZWQ2YmUwODA0OTBiYWE3N2QwY2JiNDc2ZTA3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTVkMThkMzI3NmQ0NTUwYTU5ZDRiMDM1OGFlYWE1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWE5OGQ0MTgzNjQ5NDMxMjgyNzY2NjA2ZTNlOWQ0MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzBlZmZjMWMwOTc0NDRiNTkyN2JjOWJhNzczNWI1ODIgPSAkKCc8ZGl2IGlkPSJodG1sXzMwZWZmYzFjMDk3NDQ0YjU5MjdiYzliYTc3MzViNTgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTk4ZDQxODM2NDk0MzEyODI3NjY2MDZlM2U5ZDQyNi5zZXRDb250ZW50KGh0bWxfMzBlZmZjMWMwOTc0NDRiNTkyN2JjOWJhNzczNWI1ODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTU1ZDE4ZDMyNzZkNDU1MGE1OWQ0YjAzNThhZWFhNTcuYmluZFBvcHVwKHBvcHVwX2FhOThkNDE4MzY0OTQzMTI4Mjc2NjYwNmUzZTlkNDI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VhMWNjN2Q3M2U3ZTRjNGU4OTRlNTkzYWU2ZTUxYjhjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyMzNiNzFiZjJlNzQzYjI4OTMzN2FmMmQxODA0MWFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0MzdhMTQxNmUxZjRlZTRhNzhhM2M2ZTFjMzA5ZDZiID0gJCgnPGRpdiBpZD0iaHRtbF9lNDM3YTE0MTZlMWY0ZWU0YTc4YTNjNmUxYzMwOWQ2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyMzNiNzFiZjJlNzQzYjI4OTMzN2FmMmQxODA0MWFkLnNldENvbnRlbnQoaHRtbF9lNDM3YTE0MTZlMWY0ZWU0YTc4YTNjNmUxYzMwOWQ2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYTFjYzdkNzNlN2U0YzRlODk0ZTU5M2FlNmU1MWI4Yy5iaW5kUG9wdXAocG9wdXBfZDIzM2I3MWJmMmU3NDNiMjg5MzM3YWYyZDE4MDQxYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTIxYjE4YzM3NzhkNDU4Y2FjMzUwNjkwMWRkMDYyZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZWQxYmFhZGQwZWU0YTE0YTczMDgwMTRjZjk1MGUxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTZmOGZhMTBjZjg0N2VhYTc0NmQ3YWRiYjIwN2QyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWU2ZjhmYTEwY2Y4NDdlYWE3NDZkN2FkYmIyMDdkMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlZDFiYWFkZDBlZTRhMTRhNzMwODAxNGNmOTUwZTFjLnNldENvbnRlbnQoaHRtbF81ZTZmOGZhMTBjZjg0N2VhYTc0NmQ3YWRiYjIwN2QyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjFiMThjMzc3OGQ0NThjYWMzNTA2OTAxZGQwNjJkOS5iaW5kUG9wdXAocG9wdXBfY2VkMWJhYWRkMGVlNGExNGE3MzA4MDE0Y2Y5NTBlMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzkyYmM2OTI2MGQyNGE4M2ExMTJhYmNjZjk2MjA1YjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzQ5YjMzODdiZmNlNDI5ODhkYWY5OGIxN2Y3NDc4MjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWIyN2RhOTA2N2MwNDNkMmE5OTU5MTNmZjAxODBkNDcgPSAkKCc8ZGl2IGlkPSJodG1sXzViMjdkYTkwNjdjMDQzZDJhOTk1OTEzZmYwMTgwZDQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDliMzM4N2JmY2U0Mjk4OGRhZjk4YjE3Zjc0NzgyOS5zZXRDb250ZW50KGh0bWxfNWIyN2RhOTA2N2MwNDNkMmE5OTU5MTNmZjAxODBkNDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzkyYmM2OTI2MGQyNGE4M2ExMTJhYmNjZjk2MjA1YjkuYmluZFBvcHVwKHBvcHVwXzc0OWIzMzg3YmZjZTQyOTg4ZGFmOThiMTdmNzQ3ODI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlY2Y5NDQ2NmNkZDRkYjliY2Q3MTQyNzFiZjUxNjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzAzMjA1NDM3YzNmNDIzMmIxZDhhZWMwNjQzZjdjMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGViNTdjYjk0OGVhNGQ3ODkzYTQ4MjhiNzU2Yjg2Y2YgPSAkKCc8ZGl2IGlkPSJodG1sXzhlYjU3Y2I5NDhlYTRkNzg5M2E0ODI4Yjc1NmI4NmNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMDMyMDU0MzdjM2Y0MjMyYjFkOGFlYzA2NDNmN2MwYi5zZXRDb250ZW50KGh0bWxfOGViNTdjYjk0OGVhNGQ3ODkzYTQ4MjhiNzU2Yjg2Y2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmVjZjk0NDY2Y2RkNGRiOWJjZDcxNDI3MWJmNTE2MGYuYmluZFBvcHVwKHBvcHVwX2MwMzIwNTQzN2MzZjQyMzJiMWQ4YWVjMDY0M2Y3YzBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxMzU2NmJkYmY4MDRhZjRiMjMxMDdjODM2NGE0OGQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdlNDQ3OTQ2ZTNjNDMyYmEyMmM4NzUyNmRmMGU4ZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzkyZjE0M2M5YmUzNDM0OGIwMjc5MDY0NjNlNjhlZGEgPSAkKCc8ZGl2IGlkPSJodG1sXzc5MmYxNDNjOWJlMzQzNDhiMDI3OTA2NDYzZTY4ZWRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3ZTQ0Nzk0NmUzYzQzMmJhMjJjODc1MjZkZjBlOGYyLnNldENvbnRlbnQoaHRtbF83OTJmMTQzYzliZTM0MzQ4YjAyNzkwNjQ2M2U2OGVkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMTM1NjZiZGJmODA0YWY0YjIzMTA3YzgzNjRhNDhkNy5iaW5kUG9wdXAocG9wdXBfYjdlNDQ3OTQ2ZTNjNDMyYmEyMmM4NzUyNmRmMGU4ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWE2Y2YxZjEyMmZiNDEyZGIwYjA0ZWM1MzhiMGYwZTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTIyZTA4ZTIzNGMyNDMxMzk3YzYxNGI4MDY3ZmNlZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTE0OTJmYjJlNGVmNDVhNTlhOTZmMWFhMGM1MzQ4NjEgPSAkKCc8ZGl2IGlkPSJodG1sXzExNDkyZmIyZTRlZjQ1YTU5YTk2ZjFhYTBjNTM0ODYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyMmUwOGUyMzRjMjQzMTM5N2M2MTRiODA2N2ZjZWYyLnNldENvbnRlbnQoaHRtbF8xMTQ5MmZiMmU0ZWY0NWE1OWE5NmYxYWEwYzUzNDg2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYTZjZjFmMTIyZmI0MTJkYjBiMDRlYzUzOGIwZjBlMy5iaW5kUG9wdXAocG9wdXBfZTIyZTA4ZTIzNGMyNDMxMzk3YzYxNGI4MDY3ZmNlZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTMwOWJjZGM0OTVjNGQ3M2FkZGEzOGMyYjIyNWUwMTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmY5NWRkZGM3YjA3NDVlOGE4OWZiMDMyMmJiM2Y1MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGI4ZjIzZDkxYjg3NDA2MmE2MzA2NTk2MDg3YWJlY2EgPSAkKCc8ZGl2IGlkPSJodG1sXzRiOGYyM2Q5MWI4NzQwNjJhNjMwNjU5NjA4N2FiZWNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmY5NWRkZGM3YjA3NDVlOGE4OWZiMDMyMmJiM2Y1MzIuc2V0Q29udGVudChodG1sXzRiOGYyM2Q5MWI4NzQwNjJhNjMwNjU5NjA4N2FiZWNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzMDliY2RjNDk1YzRkNzNhZGRhMzhjMmIyMjVlMDE5LmJpbmRQb3B1cChwb3B1cF9iZjk1ZGRkYzdiMDc0NWU4YTg5ZmIwMzIyYmIzZjUzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Nzc5ZjQ0NmViNTY0ZTg3OGVlYTQ0ZDI3MjNjNjMyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzllMGM0MzQzOTViYTQxNzg4NjM3OGE5NGE5NWM4NWNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgwODhlYmI5M2Y5ODQ3MTBhYTM0MDZjZmY1N2ZmMTRkID0gJCgnPGRpdiBpZD0iaHRtbF84MDg4ZWJiOTNmOTg0NzEwYWEzNDA2Y2ZmNTdmZjE0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZTBjNDM0Mzk1YmE0MTc4ODYzNzhhOTRhOTVjODVjZi5zZXRDb250ZW50KGh0bWxfODA4OGViYjkzZjk4NDcxMGFhMzQwNmNmZjU3ZmYxNGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzc3OWY0NDZlYjU2NGU4NzhlZWE0NGQyNzIzYzYzMjQuYmluZFBvcHVwKHBvcHVwXzllMGM0MzQzOTViYTQxNzg4NjM3OGE5NGE5NWM4NWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3MzRmNjNiZGYzODRmZmFiZTU4NWE5OWI2MmZhYmY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTliODZiM2YyNDJmNGQwZjhmYmQ4ZjljNTFiYjA4YmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTlhMzRjZGVjMzE0NDM4Mjg3MTM2MWQ3ODRiNTM5YTEgPSAkKCc8ZGl2IGlkPSJodG1sXzU5YTM0Y2RlYzMxNDQzODI4NzEzNjFkNzg0YjUzOWExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OWI4NmIzZjI0MmY0ZDBmOGZiZDhmOWM1MWJiMDhiYS5zZXRDb250ZW50KGh0bWxfNTlhMzRjZGVjMzE0NDM4Mjg3MTM2MWQ3ODRiNTM5YTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjczNGY2M2JkZjM4NGZmYWJlNTg1YTk5YjYyZmFiZjQuYmluZFBvcHVwKHBvcHVwXzk5Yjg2YjNmMjQyZjRkMGY4ZmJkOGY5YzUxYmIwOGJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyZWYyODNjZmUzYjQyNjI4Zjc1MWJjNzlmMTFlNzBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljMjJhZjE5MDljYzQyMzc5MTlmNzMyNjc1MjFkNDIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhY2NlMWUwZjEzNjRjYzM4MjAyNzU5ZTY5MWZiNzQ3ID0gJCgnPGRpdiBpZD0iaHRtbF85YWNjZTFlMGYxMzY0Y2MzODIwMjc1OWU2OTFmYjc0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljMjJhZjE5MDljYzQyMzc5MTlmNzMyNjc1MjFkNDIzLnNldENvbnRlbnQoaHRtbF85YWNjZTFlMGYxMzY0Y2MzODIwMjc1OWU2OTFmYjc0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMmVmMjgzY2ZlM2I0MjYyOGY3NTFiYzc5ZjExZTcwYy5iaW5kUG9wdXAocG9wdXBfOWMyMmFmMTkwOWNjNDIzNzkxOWY3MzI2NzUyMWQ0MjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzc4Yjk1ZmNmYTRlNGQxNGIzNWJkMmRkYjFjZTY3MWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2OTA3OTA2N2FhNzQyZjZiNjkxODUzMDMwYmQ4ZjY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiMWU4YjU5NTZkMzQxY2RiOTVmYjEwNDkxY2RkYzFkID0gJCgnPGRpdiBpZD0iaHRtbF9jYjFlOGI1OTU2ZDM0MWNkYjk1ZmIxMDQ5MWNkZGMxZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDY5MDc5MDY3YWE3NDJmNmI2OTE4NTMwMzBiZDhmNjUuc2V0Q29udGVudChodG1sX2NiMWU4YjU5NTZkMzQxY2RiOTVmYjEwNDkxY2RkYzFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM3OGI5NWZjZmE0ZTRkMTRiMzViZDJkZGIxY2U2NzFjLmJpbmRQb3B1cChwb3B1cF9kNjkwNzkwNjdhYTc0MmY2YjY5MTg1MzAzMGJkOGY2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDEzMzY1ZGM4Yjk0Mjk3OGVhM2U1NzM2OTBmODhiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjZThlMmY5OWE2MjQzY2Y5YjgwYWNmYTc4NjYyMGJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkNTcwODg0NDFlZDRjMDJhOTliMTFkOGMyYzg0MGU2ID0gJCgnPGRpdiBpZD0iaHRtbF85ZDU3MDg4NDQxZWQ0YzAyYTk5YjExZDhjMmM4NDBlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmNlOGUyZjk5YTYyNDNjZjliODBhY2ZhNzg2NjIwYmUuc2V0Q29udGVudChodG1sXzlkNTcwODg0NDFlZDRjMDJhOTliMTFkOGMyYzg0MGU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0MTMzNjVkYzhiOTQyOTc4ZWEzZTU3MzY5MGY4OGIyLmJpbmRQb3B1cChwb3B1cF9iY2U4ZTJmOTlhNjI0M2NmOWI4MGFjZmE3ODY2MjBiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMjI2ZTBiNmQ3MTM0YmJiODg2YzM4OTZlMmJkZmJjNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGM5ZmM2NDUxNWE2NGNhNjk1MTIzMTlmNDY1Njc5NzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGRkM2Y3YWNjNzdmNGY2MDhkZTBlMjU2M2NhNTJlYTMgPSAkKCc8ZGl2IGlkPSJodG1sXzhkZDNmN2FjYzc3ZjRmNjA4ZGUwZTI1NjNjYTUyZWEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjOWZjNjQ1MTVhNjRjYTY5NTEyMzE5ZjQ2NTY3OTcxLnNldENvbnRlbnQoaHRtbF84ZGQzZjdhY2M3N2Y0ZjYwOGRlMGUyNTYzY2E1MmVhMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMjI2ZTBiNmQ3MTM0YmJiODg2YzM4OTZlMmJkZmJjNC5iaW5kUG9wdXAocG9wdXBfMGM5ZmM2NDUxNWE2NGNhNjk1MTIzMTlmNDY1Njc5NzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjA5YmFjNDY2NzI1NDBmZjhiOTgyMDg1ZThjYjg2ODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWUxZWZhOWRhZmUwNGFmYWJkOTU4NzEwYWY3NjA0NjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTZiYTQ1NDljNTE2NDk5YzlhYTI5YTY3MDNiYjU3MmMgPSAkKCc8ZGl2IGlkPSJodG1sX2E2YmE0NTQ5YzUxNjQ5OWM5YWEyOWE2NzAzYmI1NzJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZTFlZmE5ZGFmZTA0YWZhYmQ5NTg3MTBhZjc2MDQ2MS5zZXRDb250ZW50KGh0bWxfYTZiYTQ1NDljNTE2NDk5YzlhYTI5YTY3MDNiYjU3MmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjA5YmFjNDY2NzI1NDBmZjhiOTgyMDg1ZThjYjg2ODQuYmluZFBvcHVwKHBvcHVwXzllMWVmYTlkYWZlMDRhZmFiZDk1ODcxMGFmNzYwNDYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlM2Y0YjQyZThjODQ1Yjk4MmFiNzBkMmNlYmE1N2IyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMzEzYjkxZGI3ZDQxNTM4MWI5MDk4ZTQ1ZDk1ZTJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwZWY4NGY4N2I3NzQ1MmU5M2YyZWNkMjBiYWViNGE5ID0gJCgnPGRpdiBpZD0iaHRtbF82MGVmODRmODdiNzc0NTJlOTNmMmVjZDIwYmFlYjRhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTMxM2I5MWRiN2Q0MTUzODFiOTA5OGU0NWQ5NWUyZi5zZXRDb250ZW50KGh0bWxfNjBlZjg0Zjg3Yjc3NDUyZTkzZjJlY2QyMGJhZWI0YTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWUzZjRiNDJlOGM4NDViOTgyYWI3MGQyY2ViYTU3YjIuYmluZFBvcHVwKHBvcHVwXzAxMzEzYjkxZGI3ZDQxNTM4MWI5MDk4ZTQ1ZDk1ZTJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwY2U2YTNiMzI2MjQ2NWY5NDU3NGE5YTIwNGMzMjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyYjExNDZmMDJlYjRmNmNhMjhkNTMxYmY3M2E2YzJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3MDhjMDMyZjE4YTQ2NTNhYjI3MGJjOTI4MmI2NjMxID0gJCgnPGRpdiBpZD0iaHRtbF9lNzA4YzAzMmYxOGE0NjUzYWIyNzBiYzkyODJiNjYzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyYjExNDZmMDJlYjRmNmNhMjhkNTMxYmY3M2E2YzJiLnNldENvbnRlbnQoaHRtbF9lNzA4YzAzMmYxOGE0NjUzYWIyNzBiYzkyODJiNjYzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMGNlNmEzYjMyNjI0NjVmOTQ1NzRhOWEyMDRjMzIxYS5iaW5kUG9wdXAocG9wdXBfZDJiMTE0NmYwMmViNGY2Y2EyOGQ1MzFiZjczYTZjMmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWEzNzE3NTIxYzI0NGI5NjhjYjcyZDYxMGM5ZjIyYmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhM2UzZWUzZjc1MDRkNGM4NmFmYmFhMjA2YzU3ZDJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1OGIxMWU2MDFlOTRkYWRiYTE3MWQ3ZjYyMDYwMzI2ID0gJCgnPGRpdiBpZD0iaHRtbF85NThiMTFlNjAxZTk0ZGFkYmExNzFkN2Y2MjA2MDMyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYTNlM2VlM2Y3NTA0ZDRjODZhZmJhYTIwNmM1N2QyYS5zZXRDb250ZW50KGh0bWxfOTU4YjExZTYwMWU5NGRhZGJhMTcxZDdmNjIwNjAzMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWEzNzE3NTIxYzI0NGI5NjhjYjcyZDYxMGM5ZjIyYmEuYmluZFBvcHVwKHBvcHVwXzNhM2UzZWUzZjc1MDRkNGM4NmFmYmFhMjA2YzU3ZDJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5YzBmNjgzNDkxNzQ2NmNhMjg0MGNjYzQwMmIwYzhkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTY5NjUzODAxNTViNDlkM2FmMjQxOTdmZmM2Zjc3MDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzY3ZmFlNDUyM2Y1NGUxZjkzMGQzYmVkZGUyM2QyMTYgPSAkKCc8ZGl2IGlkPSJodG1sXzM2N2ZhZTQ1MjNmNTRlMWY5MzBkM2JlZGRlMjNkMjE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk2OTY1MzgwMTU1YjQ5ZDNhZjI0MTk3ZmZjNmY3NzAwLnNldENvbnRlbnQoaHRtbF8zNjdmYWU0NTIzZjU0ZTFmOTMwZDNiZWRkZTIzZDIxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zOWMwZjY4MzQ5MTc0NjZjYTI4NDBjY2M0MDJiMGM4ZC5iaW5kUG9wdXAocG9wdXBfOTY5NjUzODAxNTViNDlkM2FmMjQxOTdmZmM2Zjc3MDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVlMjc1YTIwMDc1NGJhMzg5MzNhNGVkNzc3M2M0ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGVlZjNjNTkzYTdjNDhmMGFjYTJjY2JiNGNiNzNhMGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjM1NWI1MmMxY2UyNDA1OGEwYTRhZTYyMjIyMGYzNjAgPSAkKCc8ZGl2IGlkPSJodG1sX2IzNTViNTJjMWNlMjQwNThhMGE0YWU2MjIyMjBmMzYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZWVmM2M1OTNhN2M0OGYwYWNhMmNjYmI0Y2I3M2EwZS5zZXRDb250ZW50KGh0bWxfYjM1NWI1MmMxY2UyNDA1OGEwYTRhZTYyMjIyMGYzNjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWVlMjc1YTIwMDc1NGJhMzg5MzNhNGVkNzc3M2M0ZmIuYmluZFBvcHVwKHBvcHVwXzBlZWYzYzU5M2E3YzQ4ZjBhY2EyY2NiYjRjYjczYTBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlNWY3NzVlYjc2MTQwOTVhOWRiMDVjMDc5MDVjMDcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1OTc5ZDNkNzZkMzRlZjg5ZTk2MTM3ZGNlNTE0MmEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxNDJjYWZjMThhZTQxMGJhZDgxZTAwNTE4NjkwY2MyID0gJCgnPGRpdiBpZD0iaHRtbF9lMTQyY2FmYzE4YWU0MTBiYWQ4MWUwMDUxODY5MGNjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1OTc5ZDNkNzZkMzRlZjg5ZTk2MTM3ZGNlNTE0MmEwLnNldENvbnRlbnQoaHRtbF9lMTQyY2FmYzE4YWU0MTBiYWQ4MWUwMDUxODY5MGNjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZTVmNzc1ZWI3NjE0MDk1YTlkYjA1YzA3OTA1YzA3MS5iaW5kUG9wdXAocG9wdXBfODU5NzlkM2Q3NmQzNGVmODllOTYxMzdkY2U1MTQyYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmY2MTQ2ZTUzODA0NGI1ZmI3YTMxNmJlMmE3NzYwYzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDAzYjA4MzhlMWM0NDQwYzlkMTUzZTA5ZjY3Y2Q4NDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNiMDYwMDcyNjQzNDhiN2E1YjQwMWJjZDQ0YTNlNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzAzYjA2MDA3MjY0MzQ4YjdhNWI0MDFiY2Q0NGEzZTQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwM2IwODM4ZTFjNDQ0MGM5ZDE1M2UwOWY2N2NkODQzLnNldENvbnRlbnQoaHRtbF8wM2IwNjAwNzI2NDM0OGI3YTViNDAxYmNkNDRhM2U0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZjYxNDZlNTM4MDQ0YjVmYjdhMzE2YmUyYTc3NjBjMi5iaW5kUG9wdXAocG9wdXBfMDAzYjA4MzhlMWM0NDQwYzlkMTUzZTA5ZjY3Y2Q4NDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTA3ZDQzYzM4MGQyNDFjYzk3YWFiMWI4MjEyZDc4YjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTFkNzFhMDYyNDI2NDRjYmE2MDZiODFkMWEwNTg0MjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTdjOTZkZjQyZTJjNDRkNmJjMjZlODY1ODkzMWRiYmUgPSAkKCc8ZGl2IGlkPSJodG1sXzk3Yzk2ZGY0MmUyYzQ0ZDZiYzI2ZTg2NTg5MzFkYmJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTFkNzFhMDYyNDI2NDRjYmE2MDZiODFkMWEwNTg0MjQuc2V0Q29udGVudChodG1sXzk3Yzk2ZGY0MmUyYzQ0ZDZiYzI2ZTg2NTg5MzFkYmJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwN2Q0M2MzODBkMjQxY2M5N2FhYjFiODIxMmQ3OGIzLmJpbmRQb3B1cChwb3B1cF9hMWQ3MWEwNjI0MjY0NGNiYTYwNmI4MWQxYTA1ODQyNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTVjZGU3Y2UzOWY0NWVkOTZiYWY5Nzc2MWYxM2RjMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOTA1NzliYzRkZGI0MDA5YjgzMDMzZmZjZTIyNDFkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTI3Nzc5Y2QwOWM0ZmFlYjYxNTg0YWI5NjE4N2IzMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzEyNzc3OWNkMDljNGZhZWI2MTU4NGFiOTYxODdiMzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjkwNTc5YmM0ZGRiNDAwOWI4MzAzM2ZmY2UyMjQxZDEuc2V0Q29udGVudChodG1sXzcxMjc3NzljZDA5YzRmYWViNjE1ODRhYjk2MTg3YjMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxNWNkZTdjZTM5ZjQ1ZWQ5NmJhZjk3NzYxZjEzZGMyLmJpbmRQb3B1cChwb3B1cF9mOTA1NzliYzRkZGI0MDA5YjgzMDMzZmZjZTIyNDFkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Y2JkNmNkYzRiNTI0M2I1YThmMGYxMzNkZWYwNzY1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhNjI1YWRhN2RlZTRiNWI4MjU0YTMxNjA0ZTBkZDYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4NzUwMjAzNWVlMTQ2NDJhY2E5MDNjNTA4NjJhNDZmID0gJCgnPGRpdiBpZD0iaHRtbF9hODc1MDIwMzVlZTE0NjQyYWNhOTAzYzUwODYyYTQ2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhNjI1YWRhN2RlZTRiNWI4MjU0YTMxNjA0ZTBkZDYxLnNldENvbnRlbnQoaHRtbF9hODc1MDIwMzVlZTE0NjQyYWNhOTAzYzUwODYyYTQ2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Y2JkNmNkYzRiNTI0M2I1YThmMGYxMzNkZWYwNzY1Ni5iaW5kUG9wdXAocG9wdXBfMGE2MjVhZGE3ZGVlNGI1YjgyNTRhMzE2MDRlMGRkNjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzAyNzAzYjZjZTNlNDM3NzhjMmMzMmJiNzRlZmRlNTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDZjZjNlMzdmM2QxNGZlYjllZjA1MzliMDRjN2JiMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjQ5OGViMDJmMmI2NGMzY2FmZjI5NDRhYmQ0NGUyYWUgPSAkKCc8ZGl2IGlkPSJodG1sXzI0OThlYjAyZjJiNjRjM2NhZmYyOTQ0YWJkNDRlMmFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2Y2YzZTM3ZjNkMTRmZWI5ZWYwNTM5YjA0YzdiYjI3LnNldENvbnRlbnQoaHRtbF8yNDk4ZWIwMmYyYjY0YzNjYWZmMjk0NGFiZDQ0ZTJhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMDI3MDNiNmNlM2U0Mzc3OGMyYzMyYmI3NGVmZGU1NC5iaW5kUG9wdXAocG9wdXBfZDZjZjNlMzdmM2QxNGZlYjllZjA1MzliMDRjN2JiMjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2ExN2ZhYmMxNWI5NDM5MmJlZDI3NjYyY2NiYWUyMTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y5NDg2YWY5YThjMzQxN2M5MWE5YjdhNWYyNTQ5Y2UzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2MzFmM2QzYzY1MzRkYWVhZTliOTNlZTVlMjY5ZDk0ID0gJCgnPGRpdiBpZD0iaHRtbF9kNjMxZjNkM2M2NTM0ZGFlYWU5YjkzZWU1ZTI2OWQ5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOTQ4NmFmOWE4YzM0MTdjOTFhOWI3YTVmMjU0OWNlMy5zZXRDb250ZW50KGh0bWxfZDYzMWYzZDNjNjUzNGRhZWFlOWI5M2VlNWUyNjlkOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ExN2ZhYmMxNWI5NDM5MmJlZDI3NjYyY2NiYWUyMTYuYmluZFBvcHVwKHBvcHVwX2Y5NDg2YWY5YThjMzQxN2M5MWE5YjdhNWYyNTQ5Y2UzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiNGQ4ZjVkMjEyNjQzMTU4YWQyYzA5ZTdjNTJiOTY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5NzA1ZjY2MDRiYTQyOGM4NDU3MzBkMzZhZjY5ZDg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhNjZjOTZjYzYyZjRiYmM5NjMxZWY4Y2U1YTk0ODBmID0gJCgnPGRpdiBpZD0iaHRtbF8wYTY2Yzk2Y2M2MmY0YmJjOTYzMWVmOGNlNWE5NDgwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5NzA1ZjY2MDRiYTQyOGM4NDU3MzBkMzZhZjY5ZDg3LnNldENvbnRlbnQoaHRtbF8wYTY2Yzk2Y2M2MmY0YmJjOTYzMWVmOGNlNWE5NDgwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYjRkOGY1ZDIxMjY0MzE1OGFkMmMwOWU3YzUyYjk2OC5iaW5kUG9wdXAocG9wdXBfNzk3MDVmNjYwNGJhNDI4Yzg0NTczMGQzNmFmNjlkODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGYwMjNlOTE4NjQzNDJkNGE5NDAyYTk5MDcyNDYwNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzJiMzMxZmYzNDZiNDYyMThlY2VjZTg3OTljZjNjMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc0ZTllZGFmOTQyNDJhZGJjMGY2OTQ5OWFlMTdiMmIgPSAkKCc8ZGl2IGlkPSJodG1sXzE3NGU5ZWRhZjk0MjQyYWRiYzBmNjk0OTlhZTE3YjJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzJiMzMxZmYzNDZiNDYyMThlY2VjZTg3OTljZjNjMTQuc2V0Q29udGVudChodG1sXzE3NGU5ZWRhZjk0MjQyYWRiYzBmNjk0OTlhZTE3YjJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBmMDIzZTkxODY0MzQyZDRhOTQwMmE5OTA3MjQ2MDVjLmJpbmRQb3B1cChwb3B1cF8zMmIzMzFmZjM0NmI0NjIxOGVjZWNlODc5OWNmM2MxNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNjhhY2MyMzg2NGM0MTg5OTY3MWRiM2IzYTY5OTA0YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80Y2NiM2I1MzllNzc0N2I5YjIwMTAwZjNiMjkxNWE4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xY2JlNDkwOTJlOTk0NjczODBiYjk5OGY2YWNhMDM5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMWNiZTQ5MDkyZTk5NDY3MzgwYmI5OThmNmFjYTAzOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80Y2NiM2I1MzllNzc0N2I5YjIwMTAwZjNiMjkxNWE4OS5zZXRDb250ZW50KGh0bWxfMWNiZTQ5MDkyZTk5NDY3MzgwYmI5OThmNmFjYTAzOTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDY4YWNjMjM4NjRjNDE4OTk2NzFkYjNiM2E2OTkwNGEuYmluZFBvcHVwKHBvcHVwXzRjY2IzYjUzOWU3NzQ3YjliMjAxMDBmM2IyOTE1YTg5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA0OWYyNzA1MTU5NzQxODM4MWE1NjhjZjRhY2E1ZDg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZDRlOTNjOTI2MjA0NzIzODE2NGViYjFhNzZlMmM1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OGJmNWYzZWJkZmM0MDE4YmY3ZDc5ZWI3NzczNjI5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjhiZjVmM2ViZGZjNDAxOGJmN2Q3OWViNzc3MzYyOTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWQ0ZTkzYzkyNjIwNDcyMzgxNjRlYmIxYTc2ZTJjNTQuc2V0Q29udGVudChodG1sXzY4YmY1ZjNlYmRmYzQwMThiZjdkNzllYjc3NzM2MjkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0OWYyNzA1MTU5NzQxODM4MWE1NjhjZjRhY2E1ZDg5LmJpbmRQb3B1cChwb3B1cF81ZDRlOTNjOTI2MjA0NzIzODE2NGViYjFhNzZlMmM1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hN2YwNGE0MjIzODM0ZDdhOTNiNzJlMzc3NGU1ZDczYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zM2Q0NzdkMzQwNjY0ZDllYTA5NmY1ZTE4OTk4YWE0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jY2RiOTY0YzM0YjU0MTFmOGM2MTlmMzIzOTBlZWM0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2NkYjk2NGMzNGI1NDExZjhjNjE5ZjMyMzkwZWVjNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNkNDc3ZDM0MDY2NGQ5ZWEwOTZmNWUxODk5OGFhNDEuc2V0Q29udGVudChodG1sX2NjZGI5NjRjMzRiNTQxMWY4YzYxOWYzMjM5MGVlYzQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E3ZjA0YTQyMjM4MzRkN2E5M2I3MmUzNzc0ZTVkNzNiLmJpbmRQb3B1cChwb3B1cF8zM2Q0NzdkMzQwNjY0ZDllYTA5NmY1ZTE4OTk4YWE0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZTM4YTBjODI5ZTQ0OTRmYjk1MjYxNzU5ZDY0NTkzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDJiMTUzNDNmNDQ0NDBiMGJiNzg5MWM2MmM0MGViOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzZkMWE1MTVjYjkyNDM4N2FjNzZhNjk2YWM4NzI0NDIgPSAkKCc8ZGl2IGlkPSJodG1sXzM2ZDFhNTE1Y2I5MjQzODdhYzc2YTY5NmFjODcyNDQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyYjE1MzQzZjQ0NDQwYjBiYjc4OTFjNjJjNDBlYjhiLnNldENvbnRlbnQoaHRtbF8zNmQxYTUxNWNiOTI0Mzg3YWM3NmE2OTZhYzg3MjQ0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZTM4YTBjODI5ZTQ0OTRmYjk1MjYxNzU5ZDY0NTkzZi5iaW5kUG9wdXAocG9wdXBfMDJiMTUzNDNmNDQ0NDBiMGJiNzg5MWM2MmM0MGViOGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmY5Y2RmNmNkZmQ2NGRmMWJmOGM2ZjYwNzZiNDJlNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGJjYWIzMjk4ZTRlNDY3MWJmNDQwMzIwZTljYjE2OGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2U1NDJiY2M4N2YxNGViZGI1NWYwZTBiMzgxZWI2MmQgPSAkKCc8ZGl2IGlkPSJodG1sXzdlNTQyYmNjODdmMTRlYmRiNTVmMGUwYjM4MWViNjJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJjYWIzMjk4ZTRlNDY3MWJmNDQwMzIwZTljYjE2OGUuc2V0Q29udGVudChodG1sXzdlNTQyYmNjODdmMTRlYmRiNTVmMGUwYjM4MWViNjJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmOWNkZjZjZGZkNjRkZjFiZjhjNmY2MDc2YjQyZTQxLmJpbmRQb3B1cChwb3B1cF8wYmNhYjMyOThlNGU0NjcxYmY0NDAzMjBlOWNiMTY4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTY2ODQ3ZmE2MzY0MmRjYTE0MjRjMTgxMDhiMjA3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMzg5NGFiYjIwMmQ0NTA2OTU5M2YwMTA2YzcyZWUwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMDE1MzEzNTZhYTI0NzNlODAwNDY1ZDY0N2JkNDU3OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTAxNTMxMzU2YWEyNDczZTgwMDQ2NWQ2NDdiZDQ1NzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzODk0YWJiMjAyZDQ1MDY5NTkzZjAxMDZjNzJlZTA4LnNldENvbnRlbnQoaHRtbF9hMDE1MzEzNTZhYTI0NzNlODAwNDY1ZDY0N2JkNDU3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTY2ODQ3ZmE2MzY0MmRjYTE0MjRjMTgxMDhiMjA3OS5iaW5kUG9wdXAocG9wdXBfZjM4OTRhYmIyMDJkNDUwNjk1OTNmMDEwNmM3MmVlMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE5MTZjOWUyNjdlNDM2M2JjY2MwYzVhODQzODU5OWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWUzYTZiOTQ0YzVjNGI1YmEyZWNhNTY5ZGNkNmE4ZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTNiZmIzYjk1OTM2NDE1MmIzZTBhMDUyMDNhYzZiMTQgPSAkKCc8ZGl2IGlkPSJodG1sX2UzYmZiM2I5NTkzNjQxNTJiM2UwYTA1MjAzYWM2YjE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTNhNmI5NDRjNWM0YjViYTJlY2E1NjlkY2Q2YThkMi5zZXRDb250ZW50KGh0bWxfZTNiZmIzYjk1OTM2NDE1MmIzZTBhMDUyMDNhYzZiMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTE5MTZjOWUyNjdlNDM2M2JjY2MwYzVhODQzODU5OWQuYmluZFBvcHVwKHBvcHVwX2VlM2E2Yjk0NGM1YzRiNWJhMmVjYTU2OWRjZDZhOGQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1YTNlZjA1ZGExMzRkYmQ4MWVjZGFiYWQ0ZWM1OTUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1ODhkNDBlM2I5NzQxZjc4ZTdhYWRlMTRhMzgzOTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YTM3NmQzZTNkYzRkZWU4YzBkYTgyYzlhNDViOGYyID0gJCgnPGRpdiBpZD0iaHRtbF8yNmEzNzZkM2UzZGM0ZGVlOGMwZGE4MmM5YTQ1YjhmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTg4ZDQwZTNiOTc0MWY3OGU3YWFkZTE0YTM4MzkzNy5zZXRDb250ZW50KGh0bWxfMjZhMzc2ZDNlM2RjNGRlZThjMGRhODJjOWE0NWI4ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTVhM2VmMDVkYTEzNGRiZDgxZWNkYWJhZDRlYzU5NTEuYmluZFBvcHVwKHBvcHVwXzE1ODhkNDBlM2I5NzQxZjc4ZTdhYWRlMTRhMzgzOTM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2NTZkYWZhMzE2MjQzMGI4MzQwNWU0NjNmZTgyODU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0N2JhN2UzNzEyMTRmYmI5ZTJiY2Q5MDk5OGQxMWE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxMWFlMmNjYmZmNDQxYWQ5OTM2NzNkMzE2MWM1MzBmID0gJCgnPGRpdiBpZD0iaHRtbF85MTFhZTJjY2JmZjQ0MWFkOTkzNjczZDMxNjFjNTMwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODQ3YmE3ZTM3MTIxNGZiYjllMmJjZDkwOTk4ZDExYTYuc2V0Q29udGVudChodG1sXzkxMWFlMmNjYmZmNDQxYWQ5OTM2NzNkMzE2MWM1MzBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2NTZkYWZhMzE2MjQzMGI4MzQwNWU0NjNmZTgyODU5LmJpbmRQb3B1cChwb3B1cF84NDdiYTdlMzcxMjE0ZmJiOWUyYmNkOTA5OThkMTFhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDAzNDYxNGFmODQ0NWIwYjgxM2Q0ZjM2NmIyNTdjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MzUwNTFmYjVhMmU0Nzk5OGI4MjY0YWJjY2I0MWJhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOGYyMDhlMzIxZmY0Nzg2OTQyNTk4ZDQzZjNmZGQyNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjhmMjA4ZTMyMWZmNDc4Njk0MjU5OGQ0M2YzZmRkMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgzNTA1MWZiNWEyZTQ3OTk4YjgyNjRhYmNjYjQxYmFmLnNldENvbnRlbnQoaHRtbF9iOGYyMDhlMzIxZmY0Nzg2OTQyNTk4ZDQzZjNmZGQyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDAzNDYxNGFmODQ0NWIwYjgxM2Q0ZjM2NmIyNTdjZS5iaW5kUG9wdXAocG9wdXBfODM1MDUxZmI1YTJlNDc5OThiODI2NGFiY2NiNDFiYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2RiMmQ3NTU2MzhmNDAxYjk5N2MxMTBmMDNhNjlkZDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTY4NTRlNzBkZmRjNGUwM2E3ZjcxZGQ0ZGNiMTQ0ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjc2YmRjZTJlMDZiNGQ2MWIwMGExZmJkMmZmZDI1ODYgPSAkKCc8ZGl2IGlkPSJodG1sXzY3NmJkY2UyZTA2YjRkNjFiMDBhMWZiZDJmZmQyNTg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY4NTRlNzBkZmRjNGUwM2E3ZjcxZGQ0ZGNiMTQ0ZDUuc2V0Q29udGVudChodG1sXzY3NmJkY2UyZTA2YjRkNjFiMDBhMWZiZDJmZmQyNTg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdkYjJkNzU1NjM4ZjQwMWI5OTdjMTEwZjAzYTY5ZGQ1LmJpbmRQb3B1cChwb3B1cF9hNjg1NGU3MGRmZGM0ZTAzYTdmNzFkZDRkY2IxNDRkNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mN2E3YTE0YjEyZTU0MWEzYThhZDFiMGNmNDIxZWZlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Njg3NDJlMDRhZTE0ODVjOTgyMTM3MGYwNGJmNzNlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZDdhZjJmZjk3YWQ0N2I4ODVjM2YxZWVkMzExZDY4OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmQ3YWYyZmY5N2FkNDdiODg1YzNmMWVlZDMxMWQ2ODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODY4NzQyZTA0YWUxNDg1Yzk4MjEzNzBmMDRiZjczZWEuc2V0Q29udGVudChodG1sXzJkN2FmMmZmOTdhZDQ3Yjg4NWMzZjFlZWQzMTFkNjg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y3YTdhMTRiMTJlNTQxYTNhOGFkMWIwY2Y0MjFlZmUzLmJpbmRQb3B1cChwb3B1cF84Njg3NDJlMDRhZTE0ODVjOTgyMTM3MGYwNGJmNzNlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTY2MDVhNjc1MGI0MDVlYTE4M2EwYmVjMmJjOGE4NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1YjBjMDFiZDNlYTQzYmE5MTE5Mjg2YmY2MzYwMzkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4OGY2ZDMxZWQ2MTQwZmI4ZTk2ZThkMGIyYTY0OWJmID0gJCgnPGRpdiBpZD0iaHRtbF85ODhmNmQzMWVkNjE0MGZiOGU5NmU4ZDBiMmE2NDliZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NWIwYzAxYmQzZWE0M2JhOTExOTI4NmJmNjM2MDM5MC5zZXRDb250ZW50KGh0bWxfOTg4ZjZkMzFlZDYxNDBmYjhlOTZlOGQwYjJhNjQ5YmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU2NjA1YTY3NTBiNDA1ZWExODNhMGJlYzJiYzhhODUuYmluZFBvcHVwKHBvcHVwXzg1YjBjMDFiZDNlYTQzYmE5MTE5Mjg2YmY2MzYwMzkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5ZmZiY2IxMWQyMDRmYzM4YzI5ZmFjMTdiMWY2MGNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyYWMyM2VjNGUzOTQ2ZGM5ZTgzOWNhZGUxYTY4MjQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg5ZTA5YzY3MzIwZTRhMGM4ZjhlZjA1MGMzMmEzOWE5ID0gJCgnPGRpdiBpZD0iaHRtbF84OWUwOWM2NzMyMGU0YTBjOGY4ZWYwNTBjMzJhMzlhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJhYzIzZWM0ZTM5NDZkYzllODM5Y2FkZTFhNjgyNDYuc2V0Q29udGVudChodG1sXzg5ZTA5YzY3MzIwZTRhMGM4ZjhlZjA1MGMzMmEzOWE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5ZmZiY2IxMWQyMDRmYzM4YzI5ZmFjMTdiMWY2MGNiLmJpbmRQb3B1cChwb3B1cF80MmFjMjNlYzRlMzk0NmRjOWU4MzljYWRlMWE2ODI0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNWFiNGU5MDZhOWY0ZWZkODNhYWRhMDc4Zjk4NDgwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMWE4ZTA5YzEwZDM0YzkzODdiMGE3ODYwMWJkOGMxMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OWQ1Mzg3OGYxMDM0YzAxODdmNzc3NzY2ZTAyNTc1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzlkNTM4NzhmMTAzNGMwMTg3Zjc3Nzc2NmUwMjU3NTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMWE4ZTA5YzEwZDM0YzkzODdiMGE3ODYwMWJkOGMxMS5zZXRDb250ZW50KGh0bWxfNzlkNTM4NzhmMTAzNGMwMTg3Zjc3Nzc2NmUwMjU3NTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDVhYjRlOTA2YTlmNGVmZDgzYWFkYTA3OGY5ODQ4MDYuYmluZFBvcHVwKHBvcHVwXzAxYThlMDljMTBkMzRjOTM4N2IwYTc4NjAxYmQ4YzExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3OGFlZDhhOTg0NjQ4ZDdiZDkwMWY2YzFjY2UyYzM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZmMzMzMxOGE3ZWQ0YmIxOWEzN2NkY2FjNWI5NWNmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMWIwMGNjNzMwOTQ0Y2M0YjEyMjlhZmQ1ZWU0NjFmOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTFiMDBjYzczMDk0NGNjNGIxMjI5YWZkNWVlNDYxZjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGZjMzMzMThhN2VkNGJiMTlhMzdjZGNhYzViOTVjZjguc2V0Q29udGVudChodG1sXzExYjAwY2M3MzA5NDRjYzRiMTIyOWFmZDVlZTQ2MWY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3OGFlZDhhOTg0NjQ4ZDdiZDkwMWY2YzFjY2UyYzM4LmJpbmRQb3B1cChwb3B1cF84ZmMzMzMxOGE3ZWQ0YmIxOWEzN2NkY2FjNWI5NWNmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZmQ2YTVjYTExZTU0ODFmYWExMDFmNWM5YzdhNGZlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjgyZmM5MzgzNmY4NGYwNDllZTY5MGQ3OTM4NjM1MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQ2MGNiNWYyZDFiNGUzOGIwNDdjM2I5NjQ5NmM2YjEgPSAkKCc8ZGl2IGlkPSJodG1sXzBkNjBjYjVmMmQxYjRlMzhiMDQ3YzNiOTY0OTZjNmIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjgyZmM5MzgzNmY4NGYwNDllZTY5MGQ3OTM4NjM1MjYuc2V0Q29udGVudChodG1sXzBkNjBjYjVmMmQxYjRlMzhiMDQ3YzNiOTY0OTZjNmIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlmZDZhNWNhMTFlNTQ4MWZhYTEwMWY1YzljN2E0ZmUyLmJpbmRQb3B1cChwb3B1cF82ODJmYzkzODM2Zjg0ZjA0OWVlNjkwZDc5Mzg2MzUyNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NzQ1NmRhNjg4YWE0ODNiOGEyZWU0ZTRhMGI1NjIwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83Y2VhZDQ2NjBiZWE0OTkzYTYzZTJiNTJhZDM5MGIxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNWQ5NTRhMDJlNWY0NTE3OTMxMTg1ZTZiMDVkNDI3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTVkOTU0YTAyZTVmNDUxNzkzMTE4NWU2YjA1ZDQyNzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NlYWQ0NjYwYmVhNDk5M2E2M2UyYjUyYWQzOTBiMTYuc2V0Q29udGVudChodG1sXzE1ZDk1NGEwMmU1ZjQ1MTc5MzExODVlNmIwNWQ0MjcwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk3NDU2ZGE2ODhhYTQ4M2I4YTJlZTRlNGEwYjU2MjA5LmJpbmRQb3B1cChwb3B1cF83Y2VhZDQ2NjBiZWE0OTkzYTYzZTJiNTJhZDM5MGIxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wOWNiMmJlYWEyYjE0Y2EwYTVhM2IxZmZmNTIwMmQwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjMwMzk5NjI1YWJlNGUyNWI0YWM1ZDE1YWMxNzVhMjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGQzODQzOTJkMWQxNGIyYjgxMTA4NmJhYzVjYTQxZWUgPSAkKCc8ZGl2IGlkPSJodG1sXzRkMzg0MzkyZDFkMTRiMmI4MTEwODZiYWM1Y2E0MWVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzAzOTk2MjVhYmU0ZTI1YjRhYzVkMTVhYzE3NWEyNi5zZXRDb250ZW50KGh0bWxfNGQzODQzOTJkMWQxNGIyYjgxMTA4NmJhYzVjYTQxZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDljYjJiZWFhMmIxNGNhMGE1YTNiMWZmZjUyMDJkMGQuYmluZFBvcHVwKHBvcHVwXzYzMDM5OTYyNWFiZTRlMjViNGFjNWQxNWFjMTc1YTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkZDU0OWMxYzgxYTQ2NGI4OGQ1YTQ1MGE4MmIzMDMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OWM5MGNjZjhhNjU0Y2E2OTM0NGVkODk3NDI2M2Y1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMzYxOTkzOWZhMDk0MDJlOTc5YzJkNTAzMGIwOGMxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTM2MTk5MzlmYTA5NDAyZTk3OWMyZDUwMzBiMDhjMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5YzkwY2NmOGE2NTRjYTY5MzQ0ZWQ4OTc0MjYzZjUwLnNldENvbnRlbnQoaHRtbF9lMzYxOTkzOWZhMDk0MDJlOTc5YzJkNTAzMGIwOGMxZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZGQ1NDljMWM4MWE0NjRiODhkNWE0NTBhODJiMzAzMi5iaW5kUG9wdXAocG9wdXBfOTljOTBjY2Y4YTY1NGNhNjkzNDRlZDg5NzQyNjNmNTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGNjZmNiMTZlMmM4NGM4NGI4MDdkNDZmYjkyZmY4N2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWJjMDc5MDQ5OTJjNGJlMDlmNTA2ZWY5Zjk1YzAyNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGYyZDNjZTdiYTI1NDU4MWEwMzdmM2U4NDZiN2I5M2EgPSAkKCc8ZGl2IGlkPSJodG1sXzBmMmQzY2U3YmEyNTQ1ODFhMDM3ZjNlODQ2YjdiOTNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYmMwNzkwNDk5MmM0YmUwOWY1MDZlZjlmOTVjMDI0Yi5zZXRDb250ZW50KGh0bWxfMGYyZDNjZTdiYTI1NDU4MWEwMzdmM2U4NDZiN2I5M2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGNjZmNiMTZlMmM4NGM4NGI4MDdkNDZmYjkyZmY4N2EuYmluZFBvcHVwKHBvcHVwX2FiYzA3OTA0OTkyYzRiZTA5ZjUwNmVmOWY5NWMwMjRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1Y2JmYzljOTgwZTRjZDRiZTg0NWI4NjA0ZGRjYTkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2MmJjNjliYjk1OTQ1ZjM5MjE3NzJiN2RhMzJjMGMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxNzM1OTA0MjA3NTRkMTBiYmQwNzBmYjk1NTAwODVhID0gJCgnPGRpdiBpZD0iaHRtbF9lMTczNTkwNDIwNzU0ZDEwYmJkMDcwZmI5NTUwMDg1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjJiYzY5YmI5NTk0NWYzOTIxNzcyYjdkYTMyYzBjMC5zZXRDb250ZW50KGh0bWxfZTE3MzU5MDQyMDc1NGQxMGJiZDA3MGZiOTU1MDA4NWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDVjYmZjOWM5ODBlNGNkNGJlODQ1Yjg2MDRkZGNhOTMuYmluZFBvcHVwKHBvcHVwX2U2MmJjNjliYjk1OTQ1ZjM5MjE3NzJiN2RhMzJjMGMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwN2RmNzVhZmEzMDQ5ZWI4OTZkY2JhZjgyNjc2MGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0YzNiYzUwMTE3MDRhOTU4NTJhM2EzMzFmYmE0NDE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzYmMyMWMwZDZjZjRlNWE4NmRhNmZjYzM3OTc5NjRmID0gJCgnPGRpdiBpZD0iaHRtbF82M2JjMjFjMGQ2Y2Y0ZTVhODZkYTZmY2MzNzk3OTY0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNGMzYmM1MDExNzA0YTk1ODUyYTNhMzMxZmJhNDQxNi5zZXRDb250ZW50KGh0bWxfNjNiYzIxYzBkNmNmNGU1YTg2ZGE2ZmNjMzc5Nzk2NGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjA3ZGY3NWFmYTMwNDllYjg5NmRjYmFmODI2NzYwYjguYmluZFBvcHVwKHBvcHVwXzA0YzNiYzUwMTE3MDRhOTU4NTJhM2EzMzFmYmE0NDE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5NDJiN2MyMzMxYzRlMTA4MDM5NzYwY2ZlOTRmNTQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViZTM4YTJiZGQ3ZjRjNDU5YzdkN2VkNTk3N2RhOGJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyMzkxOTU2N2RiNzQ0YTA4ZGJiYWIwZDQ0YjU0OWMzID0gJCgnPGRpdiBpZD0iaHRtbF82MjM5MTk1NjdkYjc0NGEwOGRiYmFiMGQ0NGI1NDljMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWJlMzhhMmJkZDdmNGM0NTljN2Q3ZWQ1OTc3ZGE4YmMuc2V0Q29udGVudChodG1sXzYyMzkxOTU2N2RiNzQ0YTA4ZGJiYWIwZDQ0YjU0OWMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5NDJiN2MyMzMxYzRlMTA4MDM5NzYwY2ZlOTRmNTQyLmJpbmRQb3B1cChwb3B1cF9lYmUzOGEyYmRkN2Y0YzQ1OWM3ZDdlZDU5NzdkYThiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjgxOGIyNjEwNDg0NTYxYWYzNDFmNzgwYzZjOThjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZDhlZjE3Y2NhMGQ0OGJiOWVlNGQ1MmEyMWI1MmVlOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MWE1ZjlmYTQ0Yzk0NWZmYTYxNTc5OTQ0ODZjZDQxOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjFhNWY5ZmE0NGM5NDVmZmE2MTU3OTk0NDg2Y2Q0MTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZDhlZjE3Y2NhMGQ0OGJiOWVlNGQ1MmEyMWI1MmVlOC5zZXRDb250ZW50KGh0bWxfNjFhNWY5ZmE0NGM5NDVmZmE2MTU3OTk0NDg2Y2Q0MTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTI4MThiMjYxMDQ4NDU2MWFmMzQxZjc4MGM2Yzk4YzEuYmluZFBvcHVwKHBvcHVwXzBkOGVmMTdjY2EwZDQ4YmI5ZWU0ZDUyYTIxYjUyZWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwMzNkM2M3N2EwZDQxYTZiOTY4MGU1YmNiYTA0OWIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4ZjhjZmMxZjliZDRkOTNiZWMzZjk5NGI1ZjZlZGM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE2MDU4OTRmNjUyNTQ4NzRhYjE0M2I2YTZiZjM0ODkxID0gJCgnPGRpdiBpZD0iaHRtbF8xNjA1ODk0ZjY1MjU0ODc0YWIxNDNiNmE2YmYzNDg5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4ZjhjZmMxZjliZDRkOTNiZWMzZjk5NGI1ZjZlZGM4LnNldENvbnRlbnQoaHRtbF8xNjA1ODk0ZjY1MjU0ODc0YWIxNDNiNmE2YmYzNDg5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MDMzZDNjNzdhMGQ0MWE2Yjk2ODBlNWJjYmEwNDliMi5iaW5kUG9wdXAocG9wdXBfYzhmOGNmYzFmOWJkNGQ5M2JlYzNmOTk0YjVmNmVkYzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U4YmVlMzQxNmRjNDllNmJlYjI5NTFmNGI3ZmQ3MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODMxMGNjN2Q1NGZmNGEwYWEzZWEwYmZjYjBhZjllOTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmY0ZTdkNTFmMWQ1NGVjMjhmYmYyZjkxOGE5MTQzNTcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmNGU3ZDUxZjFkNTRlYzI4ZmJmMmY5MThhOTE0MzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzEwY2M3ZDU0ZmY0YTBhYTNlYTBiZmNiMGFmOWU5OC5zZXRDb250ZW50KGh0bWxfZmY0ZTdkNTFmMWQ1NGVjMjhmYmYyZjkxOGE5MTQzNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2U4YmVlMzQxNmRjNDllNmJlYjI5NTFmNGI3ZmQ3MTQuYmluZFBvcHVwKHBvcHVwXzgzMTBjYzdkNTRmZjRhMGFhM2VhMGJmY2IwYWY5ZTk4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwNjdkMGMyM2MxNjQ1OGQ4N2VmMDc0YzI5NmI0MDk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkOTk3NzQ1MWNiNDRkNjNhNTczYmVmOTk1MDNlYTBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmNDEzODE3ZGNjMDQwNjg4YTViNzZjZDZlMjBjYjA2ID0gJCgnPGRpdiBpZD0iaHRtbF82ZjQxMzgxN2RjYzA0MDY4OGE1Yjc2Y2Q2ZTIwY2IwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZDk5Nzc0NTFjYjQ0ZDYzYTU3M2JlZjk5NTAzZWEwYi5zZXRDb250ZW50KGh0bWxfNmY0MTM4MTdkY2MwNDA2ODhhNWI3NmNkNmUyMGNiMDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzA2N2QwYzIzYzE2NDU4ZDg3ZWYwNzRjMjk2YjQwOTguYmluZFBvcHVwKHBvcHVwXzRkOTk3NzQ1MWNiNDRkNjNhNTczYmVmOTk1MDNlYTBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYwN2UwYTFmOTE1ZTQ2ZDU5Yjc1OTIxMWEwNzA2ODk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjhjZDYzMmFlOWIzNGVlOGIwZGUyMDNiMDAxODk3Y2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjFjMjExMWEzZDI4NGU3OWI3ZWI5MGMwOGRhOGM4Y2IgPSAkKCc8ZGl2IGlkPSJodG1sXzYxYzIxMTFhM2QyODRlNzliN2ViOTBjMDhkYThjOGNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjhjZDYzMmFlOWIzNGVlOGIwZGUyMDNiMDAxODk3Y2Yuc2V0Q29udGVudChodG1sXzYxYzIxMTFhM2QyODRlNzliN2ViOTBjMDhkYThjOGNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwN2UwYTFmOTE1ZTQ2ZDU5Yjc1OTIxMWEwNzA2ODk1LmJpbmRQb3B1cChwb3B1cF9mOGNkNjMyYWU5YjM0ZWU4YjBkZTIwM2IwMDE4OTdjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NTY1ZTkwY2RiNzQ0ZDRhOWUyZTRiZmQ0ZjAwN2UxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9mNzZjZmMzY2MwMzc0MmM1YWIyYjQzMjZlNjU1MmI3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYWE4YzdjMzhjZTQ0MDU4OWZhOWQyNmMzZWM5ODY4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOTU2OWY1NWM1MmM0NGRkYWY0ZjM1MTQ0ZDkyZWU4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDk1NjlmNTVjNTJjNDRkZGFmNGYzNTE0NGQ5MmVlODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWE4YzdjMzhjZTQ0MDU4OWZhOWQyNmMzZWM5ODY4ZS5zZXRDb250ZW50KGh0bWxfZDk1NjlmNTVjNTJjNDRkZGFmNGYzNTE0NGQ5MmVlODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzU2NWU5MGNkYjc0NGQ0YTllMmU0YmZkNGYwMDdlMWQuYmluZFBvcHVwKHBvcHVwXzBhYThjN2MzOGNlNDQwNTg5ZmE5ZDI2YzNlYzk4NjhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiMTJkM2NmMjk4ODQyYjE5YjNmNWQ2ZDE0YTM0ZTE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJkNDZjZjIzY2JiNzRkY2ZiZWEwNDFmNmFmZDBlZDRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhZjk3Y2JkODNjZDRmZDI4MTE5MTgyZjMzYjZiMzZhID0gJCgnPGRpdiBpZD0iaHRtbF9hYWY5N2NiZDgzY2Q0ZmQyODExOTE4MmYzM2I2YjM2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkNDZjZjIzY2JiNzRkY2ZiZWEwNDFmNmFmZDBlZDRhLnNldENvbnRlbnQoaHRtbF9hYWY5N2NiZDgzY2Q0ZmQyODExOTE4MmYzM2I2YjM2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYjEyZDNjZjI5ODg0MmIxOWIzZjVkNmQxNGEzNGUxNC5iaW5kUG9wdXAocG9wdXBfMmQ0NmNmMjNjYmI3NGRjZmJlYTA0MWY2YWZkMGVkNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTA3YTJkNTBmNDZiNGNhMzg3ZDZiNjcxOTA3MjVkOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQ4YjJjMTQ0MmQyNDJjN2E3NWM4ODdjZDBlMTNjOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjA2YWNkZDA4ZThiNDI3YTgxMzlhZTNjNmJhZTE3ZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzIwNmFjZGQwOGU4YjQyN2E4MTM5YWUzYzZiYWUxN2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkOGIyYzE0NDJkMjQyYzdhNzVjODg3Y2QwZTEzYzlhLnNldENvbnRlbnQoaHRtbF8yMDZhY2RkMDhlOGI0MjdhODEzOWFlM2M2YmFlMTdlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDdhMmQ1MGY0NmI0Y2EzODdkNmI2NzE5MDcyNWQ4ZC5iaW5kUG9wdXAocG9wdXBfMGQ4YjJjMTQ0MmQyNDJjN2E3NWM4ODdjZDBlMTNjOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTJmMzQ5N2NlNGU2NDVmM2EzODRiMDI3MTVhOWI4OTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkNjRlZWUyZDFmMTQ3MmI5ZDIzZDVkODZjYjJiNzI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwZGIwMWViZDJkMTQwMzU4YjViNmE5Zjg1M2FmYmE0ID0gJCgnPGRpdiBpZD0iaHRtbF82MGRiMDFlYmQyZDE0MDM1OGI1YjZhOWY4NTNhZmJhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkNjRlZWUyZDFmMTQ3MmI5ZDIzZDVkODZjYjJiNzI0LnNldENvbnRlbnQoaHRtbF82MGRiMDFlYmQyZDE0MDM1OGI1YjZhOWY4NTNhZmJhNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMmYzNDk3Y2U0ZTY0NWYzYTM4NGIwMjcxNWE5Yjg5OC5iaW5kUG9wdXAocG9wdXBfN2Q2NGVlZTJkMWYxNDcyYjlkMjNkNWQ4NmNiMmI3MjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzIzMDgxOTAwN2U5NDg0OGFkNDE3ZmUyYWMyYzliNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2Y3NmNmYzNjYzAzNzQyYzVhYjJiNDMyNmU2NTUyYjdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5NTUwMTUxNTRiYjRlNTg5ZjdjMjJlNGViNTE3MGVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkYmE2Nzc3MjUzMjQ4NjY5MDk1YmU2NWQ4MTBiYjE5ID0gJCgnPGRpdiBpZD0iaHRtbF8zZGJhNjc3NzI1MzI0ODY2OTA5NWJlNjVkODEwYmIxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5NTUwMTUxNTRiYjRlNTg5ZjdjMjJlNGViNTE3MGVmLnNldENvbnRlbnQoaHRtbF8zZGJhNjc3NzI1MzI0ODY2OTA5NWJlNjVkODEwYmIxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MjMwODE5MDA3ZTk0ODQ4YWQ0MTdmZTJhYzJjOWI1Yi5iaW5kUG9wdXAocG9wdXBfZTk1NTAxNTE1NGJiNGU1ODlmN2MyMmU0ZWI1MTcwZWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmRkMDJkOGQ5OTZjNGFmNmE4MDEwN2JmZjVjYTA2NjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZjc2Y2ZjM2NjMDM3NDJjNWFiMmI0MzI2ZTY1NTJiN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTVlMjBiY2QwN2ZiNDdhNGE0NThmOTFiODQ2MDU4MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWMwMGRjMTJiZTk5NDQ4MGIwZWFhMDJhMjM0ODI1YWYgPSAkKCc8ZGl2IGlkPSJodG1sXzljMDBkYzEyYmU5OTQ0ODBiMGVhYTAyYTIzNDgyNWFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1ZTIwYmNkMDdmYjQ3YTRhNDU4ZjkxYjg0NjA1ODA4LnNldENvbnRlbnQoaHRtbF85YzAwZGMxMmJlOTk0NDgwYjBlYWEwMmEyMzQ4MjVhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZGQwMmQ4ZDk5NmM0YWY2YTgwMTA3YmZmNWNhMDY2Ni5iaW5kUG9wdXAocG9wdXBfMTVlMjBiY2QwN2ZiNDdhNGE0NThmOTFiODQ2MDU4MDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fe967753e48>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of New York using latitude and longitude values\n",
"map_newyork = folium.Map(location=[latitude, longitude], zoom_start=10)\n",
"\n",
"# add markers to map\n",
"for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):\n",
" label = '{}, {}'.format(neighborhood, borough)\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_newyork) \n",
" \n",
"map_newyork"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Folium** is a great visualization library. Feel free to zoom into the above map, and click on each circle mark to reveal the name of the neighborhood and its respective borough.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, for illustration purposes, let's simplify the above map and segment and cluster only the neighborhoods in Manhattan. So let's slice the original dataframe and create a new dataframe of the Manhattan data.\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Manhattan</td>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.910660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Manhattan</td>\n",
" <td>Chinatown</td>\n",
" <td>40.715618</td>\n",
" <td>-73.994279</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Manhattan</td>\n",
" <td>Washington Heights</td>\n",
" <td>40.851903</td>\n",
" <td>-73.936900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Manhattan</td>\n",
" <td>Inwood</td>\n",
" <td>40.867684</td>\n",
" <td>-73.921210</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Manhattan</td>\n",
" <td>Hamilton Heights</td>\n",
" <td>40.823604</td>\n",
" <td>-73.949688</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Manhattan Marble Hill 40.876551 -73.910660\n",
"1 Manhattan Chinatown 40.715618 -73.994279\n",
"2 Manhattan Washington Heights 40.851903 -73.936900\n",
"3 Manhattan Inwood 40.867684 -73.921210\n",
"4 Manhattan Hamilton Heights 40.823604 -73.949688"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data = neighborhoods[neighborhoods['Borough'] == 'Manhattan'].reset_index(drop=True)\n",
"manhattan_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get the geographical coordinates of Manhattan.\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of Manhattan are 40.7896239, -73.9598939.\n"
]
}
],
"source": [
"address = 'Manhattan, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of Manhattan are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did with all of New York City, let's visualizat Manhattan the neighborhoods in it.\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzg5NjIzOSwtNzMuOTU5ODkzOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOGZhYzFmYTdjZDk2NDEwMDgxY2E2ZWFiYmVjMTg5ODggPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyNTZjOThlODQ2ZDQ0NWJhMjcxYzY0NzQzYTJlZGJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkMWFlOTNjYmY5MDRmMTM5NTZmZDhkMmIyZGRlNjJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkMDg0NjkxMzA3MDRlMGM4NDMxMTdiMWQ1ZDRlZmU0ID0gJCgnPGRpdiBpZD0iaHRtbF85ZDA4NDY5MTMwNzA0ZTBjODQzMTE3YjFkNWQ0ZWZlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkMWFlOTNjYmY5MDRmMTM5NTZmZDhkMmIyZGRlNjJjLnNldENvbnRlbnQoaHRtbF85ZDA4NDY5MTMwNzA0ZTBjODQzMTE3YjFkNWQ0ZWZlNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjU2Yzk4ZTg0NmQ0NDViYTI3MWM2NDc0M2EyZWRiYy5iaW5kUG9wdXAocG9wdXBfZGQxYWU5M2NiZjkwNGYxMzk1NmZkOGQyYjJkZGU2MmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjk3NzA5NGYwNDRiNDcxNmE2ODhkZTRkM2RjMjgzOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGI4NTIwN2M1NTJmNGZjZjg0MjA2OTRmMzc2ZTI2YjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE3NWE5YTljYzg4NDhmYjljNGY2NTBmZDIxOGNkMzEgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhNzVhOWE5Y2M4ODQ4ZmI5YzRmNjUwZmQyMThjZDMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiODUyMDdjNTUyZjRmY2Y4NDIwNjk0ZjM3NmUyNmIwLnNldENvbnRlbnQoaHRtbF9mYTc1YTlhOWNjODg0OGZiOWM0ZjY1MGZkMjE4Y2QzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTc3MDk0ZjA0NGI0NzE2YTY4OGRlNGQzZGMyODM5Ni5iaW5kUG9wdXAocG9wdXBfNGI4NTIwN2M1NTJmNGZjZjg0MjA2OTRmMzc2ZTI2YjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGFlZjZhYjAzODg2NGIzOThiMTJhMjBjNmMyNWQ4ODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRlNGNkNzQ0NjRmNGJiM2I4ODlhNzM4MTAyYTljN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2M4MGIyYWY5MTJhNGVmYjg0YTQwYmRmMjJlNjg1NzMgPSAkKCc8ZGl2IGlkPSJodG1sXzNjODBiMmFmOTEyYTRlZmI4NGE0MGJkZjIyZTY4NTczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkZTRjZDc0NDY0ZjRiYjNiODg5YTczODEwMmE5YzdlLnNldENvbnRlbnQoaHRtbF8zYzgwYjJhZjkxMmE0ZWZiODRhNDBiZGYyMmU2ODU3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YWVmNmFiMDM4ODY0YjM5OGIxMmEyMGM2YzI1ZDg4Ni5iaW5kUG9wdXAocG9wdXBfYmRlNGNkNzQ0NjRmNGJiM2I4ODlhNzM4MTAyYTljN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2I0MmNmMDMwNmNlNDAwOGE0ZjE2NWI0OTgwZTRhN2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIzNWYwNzQ4ZmM1NDE1ZThlN2IyZDQ2ZjQzZGVkNmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWFhNTI0MGJlMmZjNGE5ODg2ODJhMzAzMzczNzNmZjMgPSAkKCc8ZGl2IGlkPSJodG1sX2VhYTUyNDBiZTJmYzRhOTg4NjgyYTMwMzM3MzczZmYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiMzVmMDc0OGZjNTQxNWU4ZTdiMmQ0NmY0M2RlZDZmLnNldENvbnRlbnQoaHRtbF9lYWE1MjQwYmUyZmM0YTk4ODY4MmEzMDMzNzM3M2ZmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YjQyY2YwMzA2Y2U0MDA4YTRmMTY1YjQ5ODBlNGE3Zi5iaW5kUG9wdXAocG9wdXBfZGIzNWYwNzQ4ZmM1NDE1ZThlN2IyZDQ2ZjQzZGVkNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2E0ZWRhYmEyMGMxNGZiMDljNjMxZGZmYjUxYTVlZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmZjM4YWFkM2JjYjQwYTg4NzJlMzBmYzE5Nzk5MzYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmYjk0NGFmODQzMjRhYTQ4MDMxOWFkYmRmNWUzOWI4ID0gJCgnPGRpdiBpZD0iaHRtbF8xZmI5NDRhZjg0MzI0YWE0ODAzMTlhZGJkZjVlMzliOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWZmMzhhYWQzYmNiNDBhODg3MmUzMGZjMTk3OTkzNjMuc2V0Q29udGVudChodG1sXzFmYjk0NGFmODQzMjRhYTQ4MDMxOWFkYmRmNWUzOWI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhNGVkYWJhMjBjMTRmYjA5YzYzMWRmZmI1MWE1ZWZmLmJpbmRQb3B1cChwb3B1cF85ZmYzOGFhZDNiY2I0MGE4ODcyZTMwZmMxOTc5OTM2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOGZkMjkyZDc3Y2I0ZTI1ODgyNDdiZWRhOWIzZjc1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTczOGQ3OTI2M2MxNGQzOWJjM2VmZjBhYjIxYmZjZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzVkYjI3ODRkZTg3NGRkM2EzZmNiZDdlYjQ0NzhiOWUgPSAkKCc8ZGl2IGlkPSJodG1sXzM1ZGIyNzg0ZGU4NzRkZDNhM2ZjYmQ3ZWI0NDc4YjllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTczOGQ3OTI2M2MxNGQzOWJjM2VmZjBhYjIxYmZjZWIuc2V0Q29udGVudChodG1sXzM1ZGIyNzg0ZGU4NzRkZDNhM2ZjYmQ3ZWI0NDc4YjllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4ZmQyOTJkNzdjYjRlMjU4ODI0N2JlZGE5YjNmNzUzLmJpbmRQb3B1cChwb3B1cF81NzM4ZDc5MjYzYzE0ZDM5YmMzZWZmMGFiMjFiZmNlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOGQyZGVmMmY1NmI0ODgyYjNmZjAzYjA1MGZiOTI0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YWYzZDMwYjdlNDY0YmJlYjcwNTFlYjRkZjcxNGIzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYTM4MDVkZDkzOGY0NDA5YWRiNTQ5NTgyYmE5ZDA2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWEzODA1ZGQ5MzhmNDQwOWFkYjU0OTU4MmJhOWQwNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YWYzZDMwYjdlNDY0YmJlYjcwNTFlYjRkZjcxNGIzZi5zZXRDb250ZW50KGh0bWxfZWEzODA1ZGQ5MzhmNDQwOWFkYjU0OTU4MmJhOWQwNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzhkMmRlZjJmNTZiNDg4MmIzZmYwM2IwNTBmYjkyNDIuYmluZFBvcHVwKHBvcHVwXzVhZjNkMzBiN2U0NjRiYmViNzA1MWViNGRmNzE0YjNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiMTBhM2Q3MzIzZjRlZjNiNWJiZTg5ZWNlYzhhNGE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1MzczZjFiYjc3MDRlYmM4YzI2NzA4NjI0ZTNmMzkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExYTA4MWU4NWM4YTQyOGNhMDZkZGQ2MGE0MWE2ZTY2ID0gJCgnPGRpdiBpZD0iaHRtbF9hMWEwODFlODVjOGE0MjhjYTA2ZGRkNjBhNDFhNmU2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1MzczZjFiYjc3MDRlYmM4YzI2NzA4NjI0ZTNmMzkwLnNldENvbnRlbnQoaHRtbF9hMWEwODFlODVjOGE0MjhjYTA2ZGRkNjBhNDFhNmU2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYjEwYTNkNzMyM2Y0ZWYzYjViYmU4OWVjZWM4YTRhNS5iaW5kUG9wdXAocG9wdXBfMzUzNzNmMWJiNzcwNGViYzhjMjY3MDg2MjRlM2YzOTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDBiYmMzYzIwNmVkNDBhMThiZGJiMjE4MTBmNjE0ZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkYTg0NjZkMjUyNzRiZmU4MzExZjA0ZmFmYzJkNzFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgzNTNiNTcwMWYxMzRmOTdhMTEzZDZkOTNjNjE4M2EzID0gJCgnPGRpdiBpZD0iaHRtbF84MzUzYjU3MDFmMTM0Zjk3YTExM2Q2ZDkzYzYxODNhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZGE4NDY2ZDI1Mjc0YmZlODMxMWYwNGZhZmMyZDcxYi5zZXRDb250ZW50KGh0bWxfODM1M2I1NzAxZjEzNGY5N2ExMTNkNmQ5M2M2MTgzYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDBiYmMzYzIwNmVkNDBhMThiZGJiMjE4MTBmNjE0ZDIuYmluZFBvcHVwKHBvcHVwXzNkYTg0NjZkMjUyNzRiZmU4MzExZjA0ZmFmYzJkNzFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3ZmFkNjY3NWUxYzQ2ZWFiNjFkODFjOGY2YmY2NTQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDkwMjViNGFkYmY0MWJhOTA0OTE2MjY0NjdkOWY5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZGVlZWZlMjcyNWM0ZjU4OGY0ZGExNjgyMzg2ZGI5YiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2RlZWVmZTI3MjVjNGY1ODhmNGRhMTY4MjM4NmRiOWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQ5MDI1YjRhZGJmNDFiYTkwNDkxNjI2NDY3ZDlmOTEuc2V0Q29udGVudChodG1sX2NkZWVlZmUyNzI1YzRmNTg4ZjRkYTE2ODIzODZkYjliKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3ZmFkNjY3NWUxYzQ2ZWFiNjFkODFjOGY2YmY2NTQyLmJpbmRQb3B1cChwb3B1cF9lNDkwMjViNGFkYmY0MWJhOTA0OTE2MjY0NjdkOWY5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNmUxOGM2ODI1Mzg0OGIwOTgyODUyMGNjNDY1MTE2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjZDRlMmY5NTNjMDQxZjdhYjI0M2JmY2EwZTU4MzZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2M2QzYmQ4NTJlMTRkY2U4YjRkMDBiZDYzZTNmNDYyID0gJCgnPGRpdiBpZD0iaHRtbF9lNjNkM2JkODUyZTE0ZGNlOGI0ZDAwYmQ2M2UzZjQ2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NkNGUyZjk1M2MwNDFmN2FiMjQzYmZjYTBlNTgzNmYuc2V0Q29udGVudChodG1sX2U2M2QzYmQ4NTJlMTRkY2U4YjRkMDBiZDYzZTNmNDYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2ZTE4YzY4MjUzODQ4YjA5ODI4NTIwY2M0NjUxMTY4LmJpbmRQb3B1cChwb3B1cF83Y2Q0ZTJmOTUzYzA0MWY3YWIyNDNiZmNhMGU1ODM2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNjliZjhlYzQ5MDU0ZjY1YjJhMjJlNThjZmNmZmE1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NGVlMTIxNTkwZWI0ZGZlOTMzMzRkMDFmNjVkZDdlMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYTA4MjJhZjYxYWU0YzgwODQxNmUzOWY3YTdhNDg5MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmEwODIyYWY2MWFlNGM4MDg0MTZlMzlmN2E3YTQ4OTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0ZWUxMjE1OTBlYjRkZmU5MzMzNGQwMWY2NWRkN2UxLnNldENvbnRlbnQoaHRtbF9mYTA4MjJhZjYxYWU0YzgwODQxNmUzOWY3YTdhNDg5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNjliZjhlYzQ5MDU0ZjY1YjJhMjJlNThjZmNmZmE1Ni5iaW5kUG9wdXAocG9wdXBfNTRlZTEyMTU5MGViNGRmZTkzMzM0ZDAxZjY1ZGQ3ZTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDFlZGEzZWQ1ZGNjNDg3N2E2MGU1NWVmMjUzNTZhYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzNDBkYjNmNTM4NTRmM2JiYWRjODhjZWUyNjc5NTIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyMGVmYWUxNjlkMjRhZWU4M2M1NTA5YTNmNjI4ZWEzID0gJCgnPGRpdiBpZD0iaHRtbF82MjBlZmFlMTY5ZDI0YWVlODNjNTUwOWEzZjYyOGVhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMzQwZGIzZjUzODU0ZjNiYmFkYzg4Y2VlMjY3OTUyMi5zZXRDb250ZW50KGh0bWxfNjIwZWZhZTE2OWQyNGFlZTgzYzU1MDlhM2Y2MjhlYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDFlZGEzZWQ1ZGNjNDg3N2E2MGU1NWVmMjUzNTZhYzQuYmluZFBvcHVwKHBvcHVwXzEzNDBkYjNmNTM4NTRmM2JiYWRjODhjZWUyNjc5NTIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0YTNhMTg1MzBmOTRjYmU5ODRlZDZjZjExYzIyZDA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0MmQ2MGYyZjMxYzQxNzViZWNhZjgyODI3MTU2MTNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5YTMwOWQ4Yzk0MzQ2YzM4Zjc2MTgyZDU5NmZiYWUwID0gJCgnPGRpdiBpZD0iaHRtbF9hOWEzMDlkOGM5NDM0NmMzOGY3NjE4MmQ1OTZmYmFlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0MmQ2MGYyZjMxYzQxNzViZWNhZjgyODI3MTU2MTNlLnNldENvbnRlbnQoaHRtbF9hOWEzMDlkOGM5NDM0NmMzOGY3NjE4MmQ1OTZmYmFlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNGEzYTE4NTMwZjk0Y2JlOTg0ZWQ2Y2YxMWMyMmQwNC5iaW5kUG9wdXAocG9wdXBfMzQyZDYwZjJmMzFjNDE3NWJlY2FmODI4MjcxNTYxM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGMyNTc0OTBhMTAwNDU3NGFjNmIzMzRiMjZkOWU3OGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg4ZDE5MzAyYjJmNDlmOTgxMjRlYTQ2NDIwOWY3MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTVjYzBhODkzNDEzNGJkMzk4ZTY1NmQyYmFlNWQ1MDUgPSAkKCc8ZGl2IGlkPSJodG1sXzk1Y2MwYTg5MzQxMzRiZDM5OGU2NTZkMmJhZTVkNTA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ODhkMTkzMDJiMmY0OWY5ODEyNGVhNDY0MjA5ZjcwMy5zZXRDb250ZW50KGh0bWxfOTVjYzBhODkzNDEzNGJkMzk4ZTY1NmQyYmFlNWQ1MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGMyNTc0OTBhMTAwNDU3NGFjNmIzMzRiMjZkOWU3OGEuYmluZFBvcHVwKHBvcHVwXzU4OGQxOTMwMmIyZjQ5Zjk4MTI0ZWE0NjQyMDlmNzAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlNmFjNmM4NjgxNjQzZjM5YjJiZTRiZDA0ZDRjMzM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4ZWI1MThiMWI4YzQ1N2M4ZjY4NTcxM2NhMDFlODFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3YjFhMTU1N2FkNDQ1MDVhMjA0Y2M2YjI0YzEyYjVlID0gJCgnPGRpdiBpZD0iaHRtbF81N2IxYTE1NTdhZDQ0NTA1YTIwNGNjNmIyNGMxMmI1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjhlYjUxOGIxYjhjNDU3YzhmNjg1NzEzY2EwMWU4MWMuc2V0Q29udGVudChodG1sXzU3YjFhMTU1N2FkNDQ1MDVhMjA0Y2M2YjI0YzEyYjVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlNmFjNmM4NjgxNjQzZjM5YjJiZTRiZDA0ZDRjMzM1LmJpbmRQb3B1cChwb3B1cF9iOGViNTE4YjFiOGM0NTdjOGY2ODU3MTNjYTAxZTgxYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNjE3ODYxMDMyZjA0ZGM0ODE3ODRkMWEwMzgzZTdkMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmIzODhiNDgyYWQ2NDc3OTkxYTE1YTAzNjE5MGRjOTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjE5ZWViN2MxMTRjNDMwNWJmYmQzNzQxMWRkZmMwZjMgPSAkKCc8ZGl2IGlkPSJodG1sX2IxOWVlYjdjMTE0YzQzMDViZmJkMzc0MTFkZGZjMGYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmIzODhiNDgyYWQ2NDc3OTkxYTE1YTAzNjE5MGRjOTQuc2V0Q29udGVudChodG1sX2IxOWVlYjdjMTE0YzQzMDViZmJkMzc0MTFkZGZjMGYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM2MTc4NjEwMzJmMDRkYzQ4MTc4NGQxYTAzODNlN2QwLmJpbmRQb3B1cChwb3B1cF82YjM4OGI0ODJhZDY0Nzc5OTFhMTVhMDM2MTkwZGM5NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZWI4NjZmNjQwOTg0MmZmYWE1NzQ5ZDc4NzM1MjY1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWFlNzEwZTQ0YmE3NDUxY2FkNWZkMjk1MjJiODc3NzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc3ZWE0MDQxZDYyNDYyYTg5YmE5YThmMmY3OTQ1MWQgPSAkKCc8ZGl2IGlkPSJodG1sXzI3N2VhNDA0MWQ2MjQ2MmE4OWJhOWE4ZjJmNzk0NTFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YWU3MTBlNDRiYTc0NTFjYWQ1ZmQyOTUyMmI4Nzc3OC5zZXRDb250ZW50KGh0bWxfMjc3ZWE0MDQxZDYyNDYyYTg5YmE5YThmMmY3OTQ1MWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGViODY2ZjY0MDk4NDJmZmFhNTc0OWQ3ODczNTI2NTMuYmluZFBvcHVwKHBvcHVwXzlhZTcxMGU0NGJhNzQ1MWNhZDVmZDI5NTIyYjg3Nzc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmYzdhYjFmOWEzNDQ4MmVhYzRkMzYzMzQ5MDVhMGM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjNzc2MmUzYzdkYjQxMzFhY2ZkYzg0MDJjZWY3MDI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3NjY2MGFlNzVhNzQ0ZGNhMzdmYWY2ZDAyYWI0ODVhID0gJCgnPGRpdiBpZD0iaHRtbF8wNzY2NjBhZTc1YTc0NGRjYTM3ZmFmNmQwMmFiNDg1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjNzc2MmUzYzdkYjQxMzFhY2ZkYzg0MDJjZWY3MDI5LnNldENvbnRlbnQoaHRtbF8wNzY2NjBhZTc1YTc0NGRjYTM3ZmFmNmQwMmFiNDg1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZmM3YWIxZjlhMzQ0ODJlYWM0ZDM2MzM0OTA1YTBjOC5iaW5kUG9wdXAocG9wdXBfMWM3NzYyZTNjN2RiNDEzMWFjZmRjODQwMmNlZjcwMjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTliYzRmYjg5NDc3NDkzOThjYzQ4NDc3Y2NiMzkyNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlOWYwOGNjNGVjMzQ2NzA5MDFkYmE2NmEwNzRjODBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1NWZkODI4YjlkZjQ1OWU4Y2U1YjhkYWU5MDZjYTJmID0gJCgnPGRpdiBpZD0iaHRtbF9mNTVmZDgyOGI5ZGY0NTllOGNlNWI4ZGFlOTA2Y2EyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTlmMDhjYzRlYzM0NjcwOTAxZGJhNjZhMDc0YzgwZi5zZXRDb250ZW50KGh0bWxfZjU1ZmQ4MjhiOWRmNDU5ZThjZTViOGRhZTkwNmNhMmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTliYzRmYjg5NDc3NDkzOThjYzQ4NDc3Y2NiMzkyNzYuYmluZFBvcHVwKHBvcHVwXzhlOWYwOGNjNGVjMzQ2NzA5MDFkYmE2NmEwNzRjODBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2MmY5NTFjZjQxMDRlOTc5MGVhNWJlMzU2ZWU0ZWM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0MjY2YjQ4MWM3YzRiM2Y5OGRmNjA4NzNiNWFiMzI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1YTViNWI4YTRlYzQ1ZGE4YzAyYmNhNTk0NmU0N2E1ID0gJCgnPGRpdiBpZD0iaHRtbF85NWE1YjViOGE0ZWM0NWRhOGMwMmJjYTU5NDZlNDdhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNDI2NmI0ODFjN2M0YjNmOThkZjYwODczYjVhYjMyNi5zZXRDb250ZW50KGh0bWxfOTVhNWI1YjhhNGVjNDVkYThjMDJiY2E1OTQ2ZTQ3YTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDYyZjk1MWNmNDEwNGU5NzkwZWE1YmUzNTZlZTRlYzcuYmluZFBvcHVwKHBvcHVwXzM0MjY2YjQ4MWM3YzRiM2Y5OGRmNjA4NzNiNWFiMzI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyNWRkY2Q1MWE0MzQ3ZWE4NTA5NWI5MDE2NGMzNmI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNTFkNzk3MWY4OWI0ZTU2YjhiZGNjNmYyMGYzODU5YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYjc4OTJmOTcwNGY0MTNjOTlmYmVkZmY1Njg5N2MwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2I3ODkyZjk3MDRmNDEzYzk5ZmJlZGZmNTY4OTdjMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U1MWQ3OTcxZjg5YjRlNTZiOGJkY2M2ZjIwZjM4NTliLnNldENvbnRlbnQoaHRtbF9jYjc4OTJmOTcwNGY0MTNjOTlmYmVkZmY1Njg5N2MwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjVkZGNkNTFhNDM0N2VhODUwOTViOTAxNjRjMzZiOC5iaW5kUG9wdXAocG9wdXBfZTUxZDc5NzFmODliNGU1NmI4YmRjYzZmMjBmMzg1OWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmRmNzdlOGUwZjZjNDljZWFiZjZlMTkxNTAxMTQ2OTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTc1NzQ5NWJiMTNkNDJiZDgxMGRkMTE4M2JiYTliMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWM5ZDY5NTk4ZTg0NDk2Yzg1OTczYWQ4YmEwYzBmZGUgPSAkKCc8ZGl2IGlkPSJodG1sX2FjOWQ2OTU5OGU4NDQ5NmM4NTk3M2FkOGJhMGMwZmRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3NTc0OTViYjEzZDQyYmQ4MTBkZDExODNiYmE5YjI5LnNldENvbnRlbnQoaHRtbF9hYzlkNjk1OThlODQ0OTZjODU5NzNhZDhiYTBjMGZkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZGY3N2U4ZTBmNmM0OWNlYWJmNmUxOTE1MDExNDY5MC5iaW5kUG9wdXAocG9wdXBfZTc1NzQ5NWJiMTNkNDJiZDgxMGRkMTE4M2JiYTliMjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTUyZDYxYTBjMWU0NDNmOGIxMTdkN2ZmNjA4MmY1ZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjFhY2QzMTkyNDhjNGRlNmIzNmU3MDUzYjM1Y2I1ZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTFkZDVhYjE1N2MxNGFhOWFhMDZmYzc2YmY2ZmM4YmIgPSAkKCc8ZGl2IGlkPSJodG1sXzExZGQ1YWIxNTdjMTRhYTlhYTA2ZmM3NmJmNmZjOGJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MWFjZDMxOTI0OGM0ZGU2YjM2ZTcwNTNiMzVjYjVlOS5zZXRDb250ZW50KGh0bWxfMTFkZDVhYjE1N2MxNGFhOWFhMDZmYzc2YmY2ZmM4YmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTUyZDYxYTBjMWU0NDNmOGIxMTdkN2ZmNjA4MmY1ZTQuYmluZFBvcHVwKHBvcHVwXzYxYWNkMzE5MjQ4YzRkZTZiMzZlNzA1M2IzNWNiNWU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlODQ4ZjlkZTI4OTQ1MzY5Y2E5MWJjNzJhOWZkOWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2YTIzNDQ0M2IzZDRhMTQ5MDJiYTIwODliMjJiN2RlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzMjIzMmM1ZTQ1NzQxZjQ5YmNiOGEwNTgwODhkNWI0ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzIyMzJjNWU0NTc0MWY0OWJjYjhhMDU4MDg4ZDViNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NmEyMzQ0NDNiM2Q0YTE0OTAyYmEyMDg5YjIyYjdkZS5zZXRDb250ZW50KGh0bWxfMjMyMjMyYzVlNDU3NDFmNDliY2I4YTA1ODA4OGQ1YjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2U4NDhmOWRlMjg5NDUzNjljYTkxYmM3MmE5ZmQ5ZWUuYmluZFBvcHVwKHBvcHVwXzc2YTIzNDQ0M2IzZDRhMTQ5MDJiYTIwODliMjJiN2RlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmY2FiM2IyMGNjMDRmOTg5NmZkNWExNjgyNDFlODhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMGU4NjJiMjRlMTc0YWI0YjFjNGIxYmU0NGU4ZDUzMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYWRlMWIzZTBlOGQ0NWI0OWI4NDAzZjdiNWQ3OGViYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMWFkZTFiM2UwZThkNDViNDliODQwM2Y3YjVkNzhlYmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwZTg2MmIyNGUxNzRhYjRiMWM0YjFiZTQ0ZThkNTMwLnNldENvbnRlbnQoaHRtbF8xYWRlMWIzZTBlOGQ0NWI0OWI4NDAzZjdiNWQ3OGViYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZmNhYjNiMjBjYzA0Zjk4OTZmZDVhMTY4MjQxZTg4Yi5iaW5kUG9wdXAocG9wdXBfMzBlODYyYjI0ZTE3NGFiNGIxYzRiMWJlNDRlOGQ1MzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmEwYjYyN2Y3NDQwNDgyMjg4NGUwOWM3ZGEzZDllNGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0YTA2NmQ2OTYyZjRjNDE5YWQ4MjM2OTZiMmVmYWY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1MGNhMmMyZGViMjQ0NTBiMGZjMmUxOTQyMzlhYzQ0ID0gJCgnPGRpdiBpZD0iaHRtbF83NTBjYTJjMmRlYjI0NDUwYjBmYzJlMTk0MjM5YWM0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTRhMDY2ZDY5NjJmNGM0MTlhZDgyMzY5NmIyZWZhZjUuc2V0Q29udGVudChodG1sXzc1MGNhMmMyZGViMjQ0NTBiMGZjMmUxOTQyMzlhYzQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhMGI2MjdmNzQ0MDQ4MjI4ODRlMDljN2RhM2Q5ZTRhLmJpbmRQb3B1cChwb3B1cF85NGEwNjZkNjk2MmY0YzQxOWFkODIzNjk2YjJlZmFmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDUzZjY4ZDQ5M2E0MWEzYWY4NmQzNTZiYjY0ZDQxZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTczNGY5NzdiMjMyNDg5MWJjNTMxODkwZWI4NTNkYmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY2ZTc1NjQxMjE2NDdkNTk3ODVhNzViYjUwNjRjYWMgPSAkKCc8ZGl2IGlkPSJodG1sXzk2NmU3NTY0MTIxNjQ3ZDU5Nzg1YTc1YmI1MDY0Y2FjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTczNGY5NzdiMjMyNDg5MWJjNTMxODkwZWI4NTNkYmQuc2V0Q29udGVudChodG1sXzk2NmU3NTY0MTIxNjQ3ZDU5Nzg1YTc1YmI1MDY0Y2FjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0NTNmNjhkNDkzYTQxYTNhZjg2ZDM1NmJiNjRkNDFmLmJpbmRQb3B1cChwb3B1cF9hNzM0Zjk3N2IyMzI0ODkxYmM1MzE4OTBlYjg1M2RiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzQ1NzAxZTRmM2E0NzRjYTEwMDEyNzUwNmNjOGQ4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NWZmMTA1YmJmODA0OTFhOWNhYWI1MzJiMDVkZTcyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NjhkNDhkOTRhN2M0ZWYzYTdmZjVkMGEwY2IxNDZlNSA9ICQoJzxkaXYgaWQ9Imh0bWxfODY4ZDQ4ZDk0YTdjNGVmM2E3ZmY1ZDBhMGNiMTQ2ZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NWZmMTA1YmJmODA0OTFhOWNhYWI1MzJiMDVkZTcyNS5zZXRDb250ZW50KGh0bWxfODY4ZDQ4ZDk0YTdjNGVmM2E3ZmY1ZDBhMGNiMTQ2ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDc0NTcwMWU0ZjNhNDc0Y2ExMDAxMjc1MDZjYzhkODguYmluZFBvcHVwKHBvcHVwXzU1ZmYxMDViYmY4MDQ5MWE5Y2FhYjUzMmIwNWRlNzI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhYWNjYzU1OTBlZTRhNTVhYWYxZDY3Yzk0NzQ5MzBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmUwODNiYjAyZTNhNDNiZTgxYTYwMDBlODI2YWY4ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2JiY2E2ZGRmNjI4NDcxYmIxNGQ5MWVjNTVjMjlkMWIgPSAkKCc8ZGl2IGlkPSJodG1sXzNiYmNhNmRkZjYyODQ3MWJiMTRkOTFlYzU1YzI5ZDFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlMDgzYmIwMmUzYTQzYmU4MWE2MDAwZTgyNmFmOGZiLnNldENvbnRlbnQoaHRtbF8zYmJjYTZkZGY2Mjg0NzFiYjE0ZDkxZWM1NWMyOWQxYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYWFjY2M1NTkwZWU0YTU1YWFmMWQ2N2M5NDc0OTMwZC5iaW5kUG9wdXAocG9wdXBfMmUwODNiYjAyZTNhNDNiZTgxYTYwMDBlODI2YWY4ZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWE3ODgxMGVjODBlNDA5Yzk5ODk0MzJjZDIyNjUwMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hZTQzZGU1MzUzZjU0MTEyYTM3ZTcwNzZlNjcxZmFmMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYzE3NzEzZTQ3ZmU0Mjg1YjJhOTE0Y2Y5OTE3NTMwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NzM0OTJlNDczYzM0MGVmYTYxM2Q2MGQ4MTdmYTE2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTczNDkyZTQ3M2MzNDBlZmE2MTNkNjBkODE3ZmExNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjMTc3MTNlNDdmZTQyODViMmE5MTRjZjk5MTc1MzA5LnNldENvbnRlbnQoaHRtbF81NzM0OTJlNDczYzM0MGVmYTYxM2Q2MGQ4MTdmYTE2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTc4ODEwZWM4MGU0MDljOTk4OTQzMmNkMjI2NTAzNS5iaW5kUG9wdXAocG9wdXBfZmMxNzcxM2U0N2ZlNDI4NWIyYTkxNGNmOTkxNzUzMDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNlZWU2MDQ4ODQzNDc2ZWJmM2ZmMmEzMTFkNDhkZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjM2M2ZlNTFjNzg2NGY4ZjkyODA0OTc5MThhYjIzYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmMwNDY3ZjVhZGY2NDE1ODgyN2E5YjQxNjkwZGFiYzcgPSAkKCc8ZGl2IGlkPSJodG1sXzZjMDQ2N2Y1YWRmNjQxNTg4MjdhOWI0MTY5MGRhYmM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMzYzZmU1MWM3ODY0ZjhmOTI4MDQ5NzkxOGFiMjNhNS5zZXRDb250ZW50KGh0bWxfNmMwNDY3ZjVhZGY2NDE1ODgyN2E5YjQxNjkwZGFiYzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNlZWU2MDQ4ODQzNDc2ZWJmM2ZmMmEzMTFkNDhkZjYuYmluZFBvcHVwKHBvcHVwX2YzNjNmZTUxYzc4NjRmOGY5MjgwNDk3OTE4YWIyM2E1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5ZDlkZWU1NDU5MjRlZDBiODI4OTQxYmE0OGU5YWQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwMThkZGM4YTZiMTQwMThhNDE1Mjk4ZjliMWQxNWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzNTVmZGI1MmRmMDQzMDA5MDYxZDJmOWNiZmVhYmZhID0gJCgnPGRpdiBpZD0iaHRtbF8xMzU1ZmRiNTJkZjA0MzAwOTA2MWQyZjljYmZlYWJmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDE4ZGRjOGE2YjE0MDE4YTQxNTI5OGY5YjFkMTVjMy5zZXRDb250ZW50KGh0bWxfMTM1NWZkYjUyZGYwNDMwMDkwNjFkMmY5Y2JmZWFiZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTlkOWRlZTU0NTkyNGVkMGI4Mjg5NDFiYTQ4ZTlhZDMuYmluZFBvcHVwKHBvcHVwXzIwMThkZGM4YTZiMTQwMThhNDE1Mjk4ZjliMWQxNWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmM2I1OTMzMmFiNzQ5MGZhMjhkYjc5YzM2NmNiZGYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2JkYjQ1NmIxOGE1NGJjNzhjOGJmMWQ4MTIzM2Q1ZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTc1ZTgwNTQ0NTZlNGE0Y2I4NzU4YmU4MmI5MDA2MjkgPSAkKCc8ZGl2IGlkPSJodG1sX2U3NWU4MDU0NDU2ZTRhNGNiODc1OGJlODJiOTAwNjI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YmRiNDU2YjE4YTU0YmM3OGM4YmYxZDgxMjMzZDVkMi5zZXRDb250ZW50KGh0bWxfZTc1ZTgwNTQ0NTZlNGE0Y2I4NzU4YmU4MmI5MDA2MjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmYzYjU5MzMyYWI3NDkwZmEyOGRiNzljMzY2Y2JkZjMuYmluZFBvcHVwKHBvcHVwXzdiZGI0NTZiMThhNTRiYzc4YzhiZjFkODEyMzNkNWQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjZjU0NTA3ZDAzZDQ0ZGRhZjIyYWVmZDUzNzU1NWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVkMjBjYjVhYTg3NzRmODM5MDk0ZmM1MzU0NzkyZjQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmM2VlMzI4YzkxZTRiOTY5ZmIyZmNhOGIxMGUwMjIzID0gJCgnPGRpdiBpZD0iaHRtbF8yZjNlZTMyOGM5MWU0Yjk2OWZiMmZjYThiMTBlMDIyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZDIwY2I1YWE4Nzc0ZjgzOTA5NGZjNTM1NDc5MmY0MS5zZXRDb250ZW50KGh0bWxfMmYzZWUzMjhjOTFlNGI5NjlmYjJmY2E4YjEwZTAyMjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2NmNTQ1MDdkMDNkNDRkZGFmMjJhZWZkNTM3NTU1ZWUuYmluZFBvcHVwKHBvcHVwXzVkMjBjYjVhYTg3NzRmODM5MDk0ZmM1MzU0NzkyZjQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjNGYzZWIyMWMwNDQyY2VhYTg0MWY4ZWU5M2E4MmRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NDRjNTI1MjM5MjQ4NGU5MmE2MDAxZGU5N2JiYzM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FlOTkyZTc5MzU5ZTRjOGQ5ZGRmMGVmNTNjNWVlZWIyID0gJCgnPGRpdiBpZD0iaHRtbF9hZTk5MmU3OTM1OWU0YzhkOWRkZjBlZjUzYzVlZWViMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY0NGM1MjUyMzkyNDg0ZTkyYTYwMDFkZTk3YmJjMzUuc2V0Q29udGVudChodG1sX2FlOTkyZTc5MzU5ZTRjOGQ5ZGRmMGVmNTNjNWVlZWIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjNGYzZWIyMWMwNDQyY2VhYTg0MWY4ZWU5M2E4MmRkLmJpbmRQb3B1cChwb3B1cF8xNjQ0YzUyNTIzOTI0ODRlOTJhNjAwMWRlOTdiYmMzNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OWU0YmY5MDFlODg0ODhiOGFlMzM0YmJkNTAyMjBiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGFiZWUxZDMwM2VhNDRjN2E1ODdkMjY3OTI0MWM0NDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTgyYTUwOThjOWQzNGI1Y2JiZWNhNGVmZjYyZGFlOGYgPSAkKCc8ZGl2IGlkPSJodG1sX2U4MmE1MDk4YzlkMzRiNWNiYmVjYTRlZmY2MmRhZThmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWJlZTFkMzAzZWE0NGM3YTU4N2QyNjc5MjQxYzQ0Ny5zZXRDb250ZW50KGh0bWxfZTgyYTUwOThjOWQzNGI1Y2JiZWNhNGVmZjYyZGFlOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzllNGJmOTAxZTg4NDg4YjhhZTMzNGJiZDUwMjIwYjEuYmluZFBvcHVwKHBvcHVwXzBhYmVlMWQzMDNlYTQ0YzdhNTg3ZDI2NzkyNDFjNDQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViYzcyNTY2YjJkZDQ3NTY4YjI0MGFkMmU1MzM3YmY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4MDFlYTMzZDc3ODRkZWQ5NzA1ZWJjZGUzNDVhMTJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViMzE0NGZmMjA1OTQ0NTRhY2ZkMDMwNzI0NWI0NTVjID0gJCgnPGRpdiBpZD0iaHRtbF9lYjMxNDRmZjIwNTk0NDU0YWNmZDAzMDcyNDViNDU1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODAxZWEzM2Q3Nzg0ZGVkOTcwNWViY2RlMzQ1YTEyYi5zZXRDb250ZW50KGh0bWxfZWIzMTQ0ZmYyMDU5NDQ1NGFjZmQwMzA3MjQ1YjQ1NWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWJjNzI1NjZiMmRkNDc1NjhiMjQwYWQyZTUzMzdiZjQuYmluZFBvcHVwKHBvcHVwXzE4MDFlYTMzZDc3ODRkZWQ5NzA1ZWJjZGUzNDVhMTJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxMzMyYTE4NjhjYzQ1ZDVhZWY4YzVkNzQyZmZlZmIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2FlNDNkZTUzNTNmNTQxMTJhMzdlNzA3NmU2NzFmYWYxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3NjQwYWU5Y2U3ODQ3Y2FiZTNkODgwZWM2MDFjMGNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhZmUwNDgyMGFhODRiMzk5NGYwZWViZTkyZDJjNmVmID0gJCgnPGRpdiBpZD0iaHRtbF8zYWZlMDQ4MjBhYTg0YjM5OTRmMGVlYmU5MmQyYzZlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3NjQwYWU5Y2U3ODQ3Y2FiZTNkODgwZWM2MDFjMGNmLnNldENvbnRlbnQoaHRtbF8zYWZlMDQ4MjBhYTg0YjM5OTRmMGVlYmU5MmQyYzZlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMTMzMmExODY4Y2M0NWQ1YWVmOGM1ZDc0MmZmZWZiMy5iaW5kUG9wdXAocG9wdXBfODc2NDBhZTljZTc4NDdjYWJlM2Q4ODBlYzYwMWMwY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjNmZWNkYjMzNTQwNDQzN2FhNTc5NmMwMmVmMWMyMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYWU0M2RlNTM1M2Y1NDExMmEzN2U3MDc2ZTY3MWZhZjEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGY4NzRkYTEwZjhjNDA0ZDg3MDNhNWEyNzc4NThjNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmM3YWYzNDNlOWE2NDY1YTliOWVjMjM4MDg5ZDAzOGEgPSAkKCc8ZGl2IGlkPSJodG1sXzJjN2FmMzQzZTlhNjQ2NWE5YjllYzIzODA4OWQwMzhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmODc0ZGExMGY4YzQwNGQ4NzAzYTVhMjc3ODU4YzRhLnNldENvbnRlbnQoaHRtbF8yYzdhZjM0M2U5YTY0NjVhOWI5ZWMyMzgwODlkMDM4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mM2ZlY2RiMzM1NDA0NDM3YWE1Nzk2YzAyZWYxYzIwZi5iaW5kUG9wdXAocG9wdXBfZGY4NzRkYTEwZjhjNDA0ZDg3MDNhNWEyNzc4NThjNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fe967753cf8>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of Manhattan using latitude and longitude values\n",
"map_manhattan = folium.Map(location=[latitude, longitude], zoom_start=11)\n",
"\n",
"# add markers to map\n",
"for lat, lng, label in zip(manhattan_data['Latitude'], manhattan_data['Longitude'], manhattan_data['Neighborhood']):\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_manhattan) \n",
" \n",
"map_manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we are going to start utilizing the Foursquare API to explore the neighborhoods and segment them.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define Foursquare Credentials and Version\n"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: ZFL0IPLDJP1B4C1MFUNUW44ULJIEZG5ZWA2SXSDR0UVHFEHZ\n",
"CLIENT_SECRET:BTEVEAKDMB5ZCLVOPV5MAMYLS5CHZLSRPI0A42M01EHUHNOF\n"
]
}
],
"source": [
"CLIENT_ID = 'ZFL0IPLDJP1B4C1MFUNUW44ULJIEZG5ZWA2SXSDR0UVHFEHZ' # your Foursquare ID\n",
"CLIENT_SECRET = 'BTEVEAKDMB5ZCLVOPV5MAMYLS5CHZLSRPI0A42M01EHUHNOF' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"LIMIT = 100 # A default Foursquare API limit value\n",
"\n",
"print('Your credentails:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's explore the first neighborhood in our dataframe.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's name.\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Marble Hill'"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data.loc[0, 'Neighborhood']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's latitude and longitude values.\n"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Latitude and longitude values of Marble Hill are 40.87655077879964, -73.91065965862981.\n"
]
}
],
"source": [
"neighborhood_latitude = manhattan_data.loc[0, 'Latitude'] # neighborhood latitude value\n",
"neighborhood_longitude = manhattan_data.loc[0, 'Longitude'] # neighborhood longitude value\n",
"\n",
"neighborhood_name = manhattan_data.loc[0, 'Neighborhood'] # neighborhood name\n",
"\n",
"print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now, let's get the top 100 venues that are in Marble Hill within a radius of 500 meters.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create the GET request URL. Name your URL **url**.\n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/explore?&client_id=ZFL0IPLDJP1B4C1MFUNUW44ULJIEZG5ZWA2SXSDR0UVHFEHZ&client_secret=BTEVEAKDMB5ZCLVOPV5MAMYLS5CHZLSRPI0A42M01EHUHNOF&v=20180605&ll=40.87655077879964,-73.91065965862981&radius=500&limit=100'"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# type your answer here\n",
"\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"\n",
"\n",
"\n",
"radius = 500 # define radius\n",
"\n",
"\n",
"\n",
" # create URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click **here** for the solution.\n",
"\n",
"<!-- The correct answer is:\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"-->\n",
"\n",
"<!--\n",
"radius = 500 # define radius\n",
"-->\n",
"\n",
"<!--\n",
"\\\\\\\\ # create URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL\n",
"--> \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Send the GET request and examine the resutls\n"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5ff1e15254a4277f8fe97f7a'},\n",
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n",
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n",
" 'headerLocation': 'Marble Hill',\n",
" 'headerFullLocation': 'Marble Hill, New York',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 23,\n",
" 'suggestedBounds': {'ne': {'lat': 40.88105078329964,\n",
" 'lng': -73.90471933917806},\n",
" 'sw': {'lat': 40.87205077429964, 'lng': -73.91659997808156}},\n",
" 'groups': [{'type': 'Recommended Places',\n",
" 'name': 'recommended',\n",
" 'items': [{'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4429abf964a52037f225e3',\n",
" 'name': \"Arturo's\",\n",
" 'location': {'address': '5198 Broadway',\n",
" 'crossStreet': 'at 225th St.',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574},\n",
" {'label': 'entrance', 'lat': 40.874401, 'lng': -73.910339}],\n",
" 'distance': 240,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5198 Broadway (at 225th St.)',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n",
" 'name': 'Pizza Place',\n",
" 'pluralName': 'Pizza Places',\n",
" 'shortName': 'Pizza',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '72548',\n",
" 'url': 'https://www.seamless.com/menu/arturos-pizza-5189-broadway-ave-new-york/72548?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=72548',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4429abf964a52037f225e3-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4baf59e8f964a520a6f93be3',\n",
" 'name': 'Bikram Yoga',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th Street',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528}],\n",
" 'distance': 376,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d102941735',\n",
" 'name': 'Yoga Studio',\n",
" 'pluralName': 'Yoga Studios',\n",
" 'shortName': 'Yoga Studio',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/gym_yogastudio_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4baf59e8f964a520a6f93be3-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b79cc46f964a520c5122fe3',\n",
" 'name': 'Tibbett Diner',\n",
" 'location': {'address': '3033 Tibbett Ave',\n",
" 'crossStreet': 'btwn 230th & 231st',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402},\n",
" {'label': 'entrance', 'lat': 40.880388, 'lng': -73.90896}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['3033 Tibbett Ave (btwn 230th & 231st)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d147941735',\n",
" 'name': 'Diner',\n",
" 'pluralName': 'Diners',\n",
" 'shortName': 'Diner',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b79cc46f964a520c5122fe3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b5357adf964a520319827e3',\n",
" 'name': \"Dunkin'\",\n",
" 'location': {'address': '5501 Broadway',\n",
" 'crossStreet': 'W 230th St',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411}],\n",
" 'distance': 342,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway (W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d148941735',\n",
" 'name': 'Donut Shop',\n",
" 'pluralName': 'Donut Shops',\n",
" 'shortName': 'Donuts',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/donuts_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '2200464',\n",
" 'url': 'https://www.seamless.com/menu/dunkin-5501-broadway-bronx/2200464?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=2200464',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b5357adf964a520319827e3-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f81cd2498ee903149fcc64',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'crossStreet': 'Kimberly Pl',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267}],\n",
" 'distance': 441,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St (Kimberly Pl)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f81cd2498ee903149fcc64-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f751ca498eacc0307d1cfe',\n",
" 'name': 'Blink Fitness',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'crossStreet': 'at W 230th St',\n",
" 'lat': 40.877271495944626,\n",
" 'lng': -73.90559491338075,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877271495944626,\n",
" 'lng': -73.90559491338075}],\n",
" 'distance': 433,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'neighborhood': 'Kingsbridge',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway (at W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f751ca498eacc0307d1cfe-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c6af964a520b27236e3',\n",
" 'name': 'Land & Sea Restaurant',\n",
" 'location': {'address': '5535 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539},\n",
" {'label': 'entrance', 'lat': 40.877906, 'lng': -73.905722}],\n",
" 'distance': 429,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5535 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ce941735',\n",
" 'name': 'Seafood Restaurant',\n",
" 'pluralName': 'Seafood Restaurants',\n",
" 'shortName': 'Seafood',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/seafood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c6af964a520b27236e3-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4cf6ae55d3a8a1cd71a9d243',\n",
" 'name': 'Astral Fitness & Wellness Center',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th St',\n",
" 'lat': 40.87670526507199,\n",
" 'lng': -73.90637207670373,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87670526507199,\n",
" 'lng': -73.90637207670373},\n",
" {'label': 'entrance', 'lat': 40.87685, 'lng': -73.906058}],\n",
" 'distance': 361,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '75803748'}},\n",
" 'referralId': 'e-0-4cf6ae55d3a8a1cd71a9d243-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '57655be738faa66160da7527',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '50 W 225th St',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668},\n",
" {'label': 'entrance', 'lat': 40.873502, 'lng': -73.907986}],\n",
" 'distance': 355,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['50 W 225th St',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-57655be738faa66160da7527-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4a725fa1f964a520f6da1fe3',\n",
" 'name': 'TCR The Club of Riverdale',\n",
" 'location': {'address': '2600 Netherland Ave',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678}],\n",
" 'distance': 402,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['2600 Netherland Ave',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4e39a891bd410d7aed40cbc2',\n",
" 'name': 'Tennis Stadium',\n",
" 'pluralName': 'Tennis Stadiums',\n",
" 'shortName': 'Tennis',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_tennis_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '40358759'}},\n",
" 'referralId': 'e-0-4a725fa1f964a520f6da1fe3-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '546d31ca498e561c698a0320',\n",
" 'name': 'T.J. Maxx',\n",
" 'location': {'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168}],\n",
" 'distance': 478,\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f6941735',\n",
" 'name': 'Department Store',\n",
" 'pluralName': 'Department Stores',\n",
" 'shortName': 'Department Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/departmentstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-546d31ca498e561c698a0320-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c43f964a520ac7236e3',\n",
" 'name': 'Lot Less Closeouts',\n",
" 'location': {'address': '5545 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604},\n",
" {'label': 'entrance', 'lat': 40.87828, 'lng': -73.905466}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5545 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c43f964a520ac7236e3-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5631194e498e2de074de661c',\n",
" 'name': 'Vitamin Shoppe',\n",
" 'location': {'address': '5510 Broadway',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632},\n",
" {'label': 'entrance', 'lat': 40.877165, 'lng': -73.905673}],\n",
" 'distance': 428,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5510 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '5744ccdfe4b0c0459246b4cd',\n",
" 'name': 'Supplement Shop',\n",
" 'pluralName': 'Supplement Shops',\n",
" 'shortName': 'Supplement Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/education/lab_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5631194e498e2de074de661c-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b88e053f964a5208a1132e3',\n",
" 'name': 'Rite Aid',\n",
" 'location': {'address': '5237 Broadway',\n",
" 'crossStreet': '228th Street',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033}],\n",
" 'distance': 190,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5237 Broadway (228th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10f951735',\n",
" 'name': 'Pharmacy',\n",
" 'pluralName': 'Pharmacies',\n",
" 'shortName': 'Pharmacy',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b88e053f964a5208a1132e3-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4e4517bd4101d0d7a67568',\n",
" 'name': 'Baskin-Robbins',\n",
" 'location': {'address': '5501 Broadway',\n",
" 'lat': 40.87714929478882,\n",
" 'lng': -73.90665810372622,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87714929478882,\n",
" 'lng': -73.90665810372622},\n",
" {'label': 'entrance', 'lat': 40.877129, 'lng': -73.906608}],\n",
" 'distance': 343,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c9941735',\n",
" 'name': 'Ice Cream Shop',\n",
" 'pluralName': 'Ice Cream Shops',\n",
" 'shortName': 'Ice Cream',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/icecream_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4e4517bd4101d0d7a67568-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4f7b65f964a5205a0827e3',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637}],\n",
" 'distance': 228,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4f7b65f964a5205a0827e3-15'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '56229ff8498e2abb44b6f12b',\n",
" 'name': 'Five Below',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'lat': 40.8772564,\n",
" 'lng': -73.9049384,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8772564,\n",
" 'lng': -73.9049384}],\n",
" 'distance': 487,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-56229ff8498e2abb44b6f12b-16'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9f030af964a520eb0f37e3',\n",
" 'name': 'GameStop',\n",
" 'location': {'address': '90 W 225th St Ste A-B',\n",
" 'crossStreet': 'btw Broadway & Exterior St.',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803}],\n",
" 'distance': 277,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['90 W 225th St Ste A-B (btw Broadway & Exterior St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10b951735',\n",
" 'name': 'Video Game Store',\n",
" 'pluralName': 'Video Game Stores',\n",
" 'shortName': 'Video Games',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/videogames_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9f030af964a520eb0f37e3-17'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4ce4debd413c4cc66d05d0',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5549 Broadway',\n",
" 'lat': 40.878464979323944,\n",
" 'lng': -73.9055176422437,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878464979323944,\n",
" 'lng': -73.9055176422437},\n",
" {'label': 'entrance', 'lat': 40.878473, 'lng': -73.905329}],\n",
" 'distance': 482,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5549 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4ce4debd413c4cc66d05d0-18'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4dfe40df8877333e195b68fc',\n",
" 'name': 'Parrilla Latina',\n",
" 'location': {'address': '230th St & Broadway',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568}],\n",
" 'distance': 399,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['230th St & Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1cc941735',\n",
" 'name': 'Steakhouse',\n",
" 'pluralName': 'Steakhouses',\n",
" 'shortName': 'Steakhouse',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/steakhouse_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4dfe40df8877333e195b68fc-19'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c852173dc018cfa2bc3e56c',\n",
" 'name': \"The Children's Place\",\n",
" 'location': {'address': '44 W 225th St',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873671591133125,\n",
" 'lng': -73.90815619608166}],\n",
" 'distance': 383,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['44 W 225th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d105951735',\n",
" 'name': 'Kids Store',\n",
" 'pluralName': 'Kids Stores',\n",
" 'shortName': 'Kids Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c852173dc018cfa2bc3e56c-20'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '53319bb511d2ef06787f02b4',\n",
" 'name': 'Broadway Plaza',\n",
" 'location': {'address': '171 W 231st St',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178}],\n",
" 'distance': 456,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 231st St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fd941735',\n",
" 'name': 'Shopping Mall',\n",
" 'pluralName': 'Shopping Malls',\n",
" 'shortName': 'Mall',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/mall_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-53319bb511d2ef06787f02b4-21'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ed7956b8b81b2bf28adc714',\n",
" 'name': 'Terrace View Delicatessen',\n",
" 'location': {'address': '135 Terrace View Ave.',\n",
" 'lat': 40.875995,\n",
" 'lng': -73.913151,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875995,\n",
" 'lng': -73.913151},\n",
" {'label': 'entrance', 'lat': 40.875964, 'lng': -73.912985}],\n",
" 'distance': 218,\n",
" 'postalCode': '10034',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['135 Terrace View Ave.',\n",
" 'New York, NY 10034',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d146941735',\n",
" 'name': 'Deli / Bodega',\n",
" 'pluralName': 'Delis / Bodegas',\n",
" 'shortName': 'Deli / Bodega',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ed7956b8b81b2bf28adc714-22'}]}]}}"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the Foursquare lab in the previous module, we know that all the information is in the _items_ key. Before we proceed, let's borrow the **get_category_type** function from the Foursquare lab.\n"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are ready to clean the json and structure it into a _pandas_ dataframe.\n"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:3: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead\n",
" This is separate from the ipykernel package so we can avoid doing imports until\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>categories</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Arturo's</td>\n",
" <td>Pizza Place</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bikram Yoga</td>\n",
" <td>Yoga Studio</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Tibbett Diner</td>\n",
" <td>Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Dunkin'</td>\n",
" <td>Donut Shop</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Starbucks</td>\n",
" <td>Coffee Shop</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories lat lng\n",
"0 Arturo's Pizza Place 40.874412 -73.910271\n",
"1 Bikram Yoga Yoga Studio 40.876844 -73.906204\n",
"2 Tibbett Diner Diner 40.880404 -73.908937\n",
"3 Dunkin' Donut Shop 40.877136 -73.906666\n",
"4 Starbucks Coffee Shop 40.877531 -73.905582"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"venues = results['response']['groups'][0]['items']\n",
" \n",
"nearby_venues = json_normalize(venues) # flatten JSON\n",
"\n",
"# filter columns\n",
"filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n",
"nearby_venues =nearby_venues.loc[:, filtered_columns]\n",
"\n",
"# filter the category for each row\n",
"nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n",
"\n",
"# clean columns\n",
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n",
"\n",
"nearby_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And how many venues were returned by Foursquare?\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"23 venues were returned by Foursquare.\n"
]
}
],
"source": [
"print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item2'></a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Explore Neighborhoods in Manhattan\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's create a function to repeat the same process to all the neighborhoods in Manhattan\n"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"def getNearbyVenues(names, latitudes, longitudes, radius=500):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" print(name)\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Neighborhood', \n",
" 'Neighborhood Latitude', \n",
" 'Neighborhood Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now write the code to run the above function on each neighborhood and create a new dataframe called _manhattan_venues_.\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Marble Hill\n",
"Chinatown\n",
"Washington Heights\n",
"Inwood\n",
"Hamilton Heights\n",
"Manhattanville\n",
"Central Harlem\n",
"East Harlem\n",
"Upper East Side\n",
"Yorkville\n",
"Lenox Hill\n",
"Roosevelt Island\n",
"Upper West Side\n",
"Lincoln Square\n",
"Clinton\n",
"Midtown\n",
"Murray Hill\n",
"Chelsea\n",
"Greenwich Village\n",
"East Village\n",
"Lower East Side\n",
"Tribeca\n",
"Little Italy\n",
"Soho\n",
"West Village\n",
"Manhattan Valley\n",
"Morningside Heights\n",
"Gramercy\n",
"Battery Park City\n",
"Financial District\n",
"Carnegie Hill\n",
"Noho\n",
"Civic Center\n",
"Midtown South\n",
"Sutton Place\n",
"Turtle Bay\n",
"Tudor City\n",
"Stuyvesant Town\n",
"Flatiron\n",
"Hudson Yards\n"
]
}
],
"source": [
"# type your answer here\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click **here** for the solution.\n",
"\n",
"<!-- The correct answer is:\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"--> \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's check the size of the resulting dataframe\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3206, 7)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Arturo's</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" <td>Pizza Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Bikram Yoga</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" <td>Yoga Studio</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Tibbett Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" <td>Diner</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Dunkin'</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" <td>Donut Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Starbucks</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"0 Marble Hill 40.876551 -73.91066 Arturo's \n",
"1 Marble Hill 40.876551 -73.91066 Bikram Yoga \n",
"2 Marble Hill 40.876551 -73.91066 Tibbett Diner \n",
"3 Marble Hill 40.876551 -73.91066 Dunkin' \n",
"4 Marble Hill 40.876551 -73.91066 Starbucks \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"0 40.874412 -73.910271 Pizza Place \n",
"1 40.876844 -73.906204 Yoga Studio \n",
"2 40.880404 -73.908937 Diner \n",
"3 40.877136 -73.906666 Donut Shop \n",
"4 40.877531 -73.905582 Coffee Shop "
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(manhattan_venues.shape)\n",
"manhattan_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check how many venues were returned for each neighborhood\n"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Neighborhood</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Battery Park City</th>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Carnegie Hill</th>\n",
" <td>89</td>\n",
" <td>89</td>\n",
" <td>89</td>\n",
" <td>89</td>\n",
" <td>89</td>\n",
" <td>89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Central Harlem</th>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" <td>44</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chelsea</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chinatown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Civic Center</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clinton</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Harlem</th>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Financial District</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Flatiron</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gramercy</th>\n",
" <td>84</td>\n",
" <td>84</td>\n",
" <td>84</td>\n",
" <td>84</td>\n",
" <td>84</td>\n",
" <td>84</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greenwich Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hamilton Heights</th>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" <td>62</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hudson Yards</th>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" <td>71</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Inwood</th>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" <td>56</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lenox Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lincoln Square</th>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" <td>93</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Little Italy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lower East Side</th>\n",
" <td>51</td>\n",
" <td>51</td>\n",
" <td>51</td>\n",
" <td>51</td>\n",
" <td>51</td>\n",
" <td>51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattan Valley</th>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattanville</th>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Marble Hill</th>\n",
" <td>23</td>\n",
" <td>23</td>\n",
" <td>23</td>\n",
" <td>23</td>\n",
" <td>23</td>\n",
" <td>23</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown South</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Morningside Heights</th>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" <td>42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Murray Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Noho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Roosevelt Island</th>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" <td>27</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Stuyvesant Town</th>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sutton Place</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tribeca</th>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" <td>88</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tudor City</th>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" <td>78</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Turtle Bay</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper East Side</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper West Side</th>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" <td>91</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Washington Heights</th>\n",
" <td>83</td>\n",
" <td>83</td>\n",
" <td>83</td>\n",
" <td>83</td>\n",
" <td>83</td>\n",
" <td>83</td>\n",
" </tr>\n",
" <tr>\n",
" <th>West Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yorkville</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"Neighborhood \n",
"Battery Park City 77 77 77 \n",
"Carnegie Hill 89 89 89 \n",
"Central Harlem 44 44 44 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 100 100 100 \n",
"Clinton 100 100 100 \n",
"East Harlem 39 39 39 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 84 84 84 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 62 62 62 \n",
"Hudson Yards 71 71 71 \n",
"Inwood 56 56 56 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 93 93 93 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 51 51 51 \n",
"Manhattan Valley 46 46 46 \n",
"Manhattanville 43 43 43 \n",
"Marble Hill 23 23 23 \n",
"Midtown 100 100 100 \n",
"Midtown South 100 100 100 \n",
"Morningside Heights 42 42 42 \n",
"Murray Hill 100 100 100 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 27 27 27 \n",
"Soho 100 100 100 \n",
"Stuyvesant Town 19 19 19 \n",
"Sutton Place 100 100 100 \n",
"Tribeca 88 88 88 \n",
"Tudor City 78 78 78 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 100 100 100 \n",
"Upper West Side 91 91 91 \n",
"Washington Heights 83 83 83 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"Neighborhood \n",
"Battery Park City 77 77 77 \n",
"Carnegie Hill 89 89 89 \n",
"Central Harlem 44 44 44 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 100 100 100 \n",
"Clinton 100 100 100 \n",
"East Harlem 39 39 39 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 84 84 84 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 62 62 62 \n",
"Hudson Yards 71 71 71 \n",
"Inwood 56 56 56 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 93 93 93 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 51 51 51 \n",
"Manhattan Valley 46 46 46 \n",
"Manhattanville 43 43 43 \n",
"Marble Hill 23 23 23 \n",
"Midtown 100 100 100 \n",
"Midtown South 100 100 100 \n",
"Morningside Heights 42 42 42 \n",
"Murray Hill 100 100 100 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 27 27 27 \n",
"Soho 100 100 100 \n",
"Stuyvesant Town 19 19 19 \n",
"Sutton Place 100 100 100 \n",
"Tribeca 88 88 88 \n",
"Tudor City 78 78 78 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 100 100 100 \n",
"Upper West Side 91 91 91 \n",
"Washington Heights 83 83 83 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 "
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_venues.groupby('Neighborhood').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's find out how many unique categories can be curated from all the returned venues\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 333 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(manhattan_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item3'></a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Analyze Each Neighborhood\n"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Animal Shelter</th>\n",
" <th>Antique Shop</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Bed &amp; Breakfast</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Big Box Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cajun / Creole Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Cha Chaan Teng</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Christmas Market</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Arts Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cooking School</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Egyptian Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Stand</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Gluten-free Restaurant</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>High School</th>\n",
" <th>Hill</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kebab Restaurant</th>\n",
" <th>Kids Store</th>\n",
" <th>Kitchen Supply Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Leather Goods Store</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts School</th>\n",
" <th>Massage Studio</th>\n",
" <th>Mattress Store</th>\n",
" <th>Medical Center</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Moving Target</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Great Outdoors</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paella Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pastry Shop</th>\n",
" <th>Pedestrian Plaza</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Studio</th>\n",
" <th>Physical Therapist</th>\n",
" <th>Piano Bar</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pier</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Recording Studio</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Resort</th>\n",
" <th>Rest Area</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Rock Climbing Spot</th>\n",
" <th>Rock Club</th>\n",
" <th>Roof Deck</th>\n",
" <th>Russian Restaurant</th>\n",
" <th>Sake Bar</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scandinavian Restaurant</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shipping Store</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Skating Rink</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soba Restaurant</th>\n",
" <th>Soccer Field</th>\n",
" <th>Social Club</th>\n",
" <th>Soup Place</th>\n",
" <th>South Indian Restaurant</th>\n",
" <th>Southern / Soul Food Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Stables</th>\n",
" <th>Steakhouse</th>\n",
" <th>Street Art</th>\n",
" <th>Strip Club</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Swiss Restaurant</th>\n",
" <th>Szechuan Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tattoo Parlor</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Tennis Court</th>\n",
" <th>Tennis Stadium</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Park Ride / Attraction</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tiki Bar</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Train Station</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Udon Restaurant</th>\n",
" <th>Used Bookstore</th>\n",
" <th>Vape Store</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Venezuelan Restaurant</th>\n",
" <th>Veterinarian</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Volleyball Court</th>\n",
" <th>Waterfront</th>\n",
" <th>Whisky Bar</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Marble Hill 0 0 0 \n",
"1 Marble Hill 0 0 0 \n",
"2 Marble Hill 0 0 0 \n",
"3 Marble Hill 0 0 0 \n",
"4 Marble Hill 0 0 0 \n",
"\n",
" African Restaurant American Restaurant Animal Shelter Antique Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Argentinian Restaurant Art Gallery Art Museum Arts & Crafts Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Asian Restaurant Athletics & Sports Auditorium Australian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Austrian Restaurant BBQ Joint Baby Store Bagel Shop Bakery Bank Bar \\\n",
"0 0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" Baseball Field Basketball Court Bed & Breakfast Beer Bar Beer Garden \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Beer Store Big Box Store Bike Rental / Bike Share Bike Shop Bike Trail \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bistro Board Shop Boat or Ferry Bookstore Boutique Boxing Gym \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Brazilian Restaurant Breakfast Spot Bridal Shop Bridge Bubble Tea Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Building Burger Joint Burrito Place Bus Line Bus Station Butcher \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Cafeteria Café Cajun / Creole Restaurant Camera Store Candy Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Cantonese Restaurant Caribbean Restaurant Cha Chaan Teng Cheese Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Chinese Restaurant Chocolate Shop Christmas Market Circus Climbing Gym \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Clothing Store Club House Cocktail Bar Coffee Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 1 \n",
"\n",
" College Academic Building College Arts Building College Bookstore \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" College Cafeteria Comedy Club Community Center Concert Hall \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Convenience Store Cooking School Cosmetics Shop Coworking Space \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Creperie Cuban Restaurant Cupcake Shop Cycle Studio Czech Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dance Studio Daycare Deli / Bodega Department Store Design Studio \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dessert Shop Dim Sum Restaurant Diner Discount Store Dive Bar \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 1 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Doctor's Office Dog Run Donut Shop Drugstore Dry Cleaner \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 1 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dumpling Restaurant Duty-free Shop Eastern European Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Egyptian Restaurant Electronics Store Empanada Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" English Restaurant Ethiopian Restaurant Event Space Exhibit \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Falafel Restaurant Farmers Market Fast Food Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Filipino Restaurant Fish Market Flea Market Flower Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Food & Drink Shop Food Court Food Stand Food Truck Fountain \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gastropub Gay Bar General Entertainment German Restaurant Gift Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gluten-free Restaurant Gourmet Shop Greek Restaurant Grocery Store Gym \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gym / Fitness Center Gym Pool Gymnastics Gym Harbor / Marina \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Hardware Store Hawaiian Restaurant Health & Beauty Service \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Health Food Store Heliport High School Hill Historic Site \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" History Museum Hobby Shop Hookah Bar Hostel Hot Dog Joint Hotel \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Hotel Bar Hotpot Restaurant Ice Cream Shop Indian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Indie Movie Theater Indie Theater Irish Pub Israeli Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Italian Restaurant Japanese Curry Restaurant Japanese Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Jazz Club Jewelry Store Jewish Restaurant Juice Bar Karaoke Bar \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Kebab Restaurant Kids Store Kitchen Supply Store Korean Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Kosher Restaurant Latin American Restaurant Laundry Service \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Leather Goods Store Lebanese Restaurant Library Lingerie Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Liquor Store Lounge Malay Restaurant Market Martial Arts School \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Massage Studio Mattress Store Medical Center Mediterranean Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Memorial Site Men's Store Metro Station Mexican Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Middle Eastern Restaurant Miscellaneous Shop Mobile Phone Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Modern European Restaurant Molecular Gastronomy Restaurant \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
" Monument / Landmark Moroccan Restaurant Movie Theater Moving Target \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Museum Music School Music Venue Nail Salon New American Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Newsstand Nightclub Non-Profit Noodle House North Indian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Office Opera House Optical Shop Organic Grocery Other Great Outdoors \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Outdoor Sculpture Outdoors & Recreation Paella Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Paper / Office Supplies Store Park Pastry Shop Pedestrian Plaza \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Performing Arts Venue Persian Restaurant Peruvian Restaurant Pet Café \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Pet Service Pet Store Pharmacy Photography Studio Physical Therapist \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Piano Bar Pie Shop Pier Pilates Studio Pizza Place Playground Plaza \\\n",
"0 0 0 0 0 1 0 0 \n",
"1 0 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 0 \n",
"\n",
" Poke Place Pool Pub Public Art Ramen Restaurant Record Shop \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Recording Studio Rental Car Location \\\n",
"0 0 0 \n",
"1 0 0 \n",
"2 0 0 \n",
"3 0 0 \n",
"4 0 0 \n",
"\n",
" Residential Building (Apartment / Condo) Resort Rest Area Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" River Rock Climbing Spot Rock Club Roof Deck Russian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Sake Bar Salad Place Salon / Barbershop Sandwich Place \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Scandinavian Restaurant Scenic Lookout School Seafood Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Shanghai Restaurant Shipping Store Shoe Store Shopping Mall Skate Park \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Skating Rink Smoke Shop Snack Place Soba Restaurant Soccer Field \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Social Club Soup Place South Indian Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Southern / Soul Food Restaurant Spa Spanish Restaurant Speakeasy \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Sporting Goods Shop Sports Bar Sports Club Stables Steakhouse \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Street Art Strip Club Supermarket Supplement Shop Sushi Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Swiss Restaurant Szechuan Restaurant Taco Place Tailor Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Taiwanese Restaurant Tapas Restaurant Tattoo Parlor Tea Room \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Tech Startup Tennis Court Tennis Stadium Thai Restaurant Theater \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Theme Park Ride / Attraction Thrift / Vintage Store Tiki Bar \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Tourist Information Center Toy / Game Store Trail Train Station \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Turkish Restaurant Udon Restaurant Used Bookstore Vape Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Vegetarian / Vegan Restaurant Venezuelan Restaurant Veterinarian \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Video Game Store Video Store Vietnamese Restaurant Volleyball Court \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Waterfront Whisky Bar Wine Bar Wine Shop Wings Joint Women's Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Yoga Studio \n",
"0 0 \n",
"1 1 \n",
"2 0 \n",
"3 0 \n",
"4 0 "
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# one hot encoding\n",
"manhattan_onehot = pd.get_dummies(manhattan_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"\n",
"# add neighborhood column back to dataframe\n",
"manhattan_onehot['Neighborhood'] = manhattan_venues['Neighborhood'] \n",
"\n",
"# move neighborhood column to the first column\n",
"fixed_columns = [manhattan_onehot.columns[-1]] + list(manhattan_onehot.columns[:-1])\n",
"manhattan_onehot = manhattan_onehot[fixed_columns]\n",
"\n",
"manhattan_onehot.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And let's examine the new dataframe size.\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(3206, 334)"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_onehot.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Animal Shelter</th>\n",
" <th>Antique Shop</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Bed &amp; Breakfast</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Big Box Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cajun / Creole Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Cha Chaan Teng</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Christmas Market</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Arts Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cooking School</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Egyptian Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Stand</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Gluten-free Restaurant</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>High School</th>\n",
" <th>Hill</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kebab Restaurant</th>\n",
" <th>Kids Store</th>\n",
" <th>Kitchen Supply Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Leather Goods Store</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts School</th>\n",
" <th>Massage Studio</th>\n",
" <th>Mattress Store</th>\n",
" <th>Medical Center</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Moving Target</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Great Outdoors</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paella Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pastry Shop</th>\n",
" <th>Pedestrian Plaza</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Studio</th>\n",
" <th>Physical Therapist</th>\n",
" <th>Piano Bar</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pier</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Rec
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment