Skip to content

Instantly share code, notes, and snippets.

@maptastik
Last active October 26, 2018 19:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maptastik/1fa2b5e7a2e657a9b3891615e10a2c47 to your computer and use it in GitHub Desktop.
Save maptastik/1fa2b5e7a2e657a9b3891615e10a2c47 to your computer and use it in GitHub Desktop.
osmnx test on parks in Lenox, MA
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Testing osmnx shortest routes analysis in Lenox, MA"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.8.2'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"import json\n",
"import functools\n",
"import networkx as nx\n",
"import osmnx as ox\n",
"from geopy import Nominatim\n",
"import geopandas as gpd\n",
"import folium\n",
"from shapely.geometry import LineString, Point\n",
"ox.config(use_cache = True, log_console = True)\n",
"ox.__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load origins\n",
"\n",
"In this case we're using some quasi-random locations, geocoding them using the Nominatim geocoder from OSM, and outputting the locations to a GeoDataFrame. For Raleigh we'll use Census Block Centroids so won't have to carry out this step."
]
},
{
"cell_type": "code",
"execution_count": 2,
"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>address</th>\n",
" <th>geometry</th>\n",
" <th>site</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12, Sunset Avenue, Lenox, Berkshire, Massachus...</td>\n",
" <td>POINT (-73.285592038448 42.3584508418913)</td>\n",
" <td>Pederson House</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>8, Franklin Street, Lenox, Berkshire, Massachu...</td>\n",
" <td>POINT (-73.2822653207234 42.359445166481)</td>\n",
" <td>Haven</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2, Kemble Street, Lenox, Berkshire, Massachuse...</td>\n",
" <td>POINT (-73.282087 42.354224)</td>\n",
" <td>Kemble Inn</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>45, West Street, Lenox, Berkshire, Massachuset...</td>\n",
" <td>POINT (-73.28859677553029 42.3568093607335)</td>\n",
" <td>Tanglewood Institute</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2, Crystal Street, Lenox, Berkshire, Massachus...</td>\n",
" <td>POINT (-73.246393 42.333106)</td>\n",
" <td>Tanners Market</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>172, Housatonic Street, Lenox, Berkshire, Mass...</td>\n",
" <td>POINT (-73.27257299999999 42.355483)</td>\n",
" <td>Berkshire Grain</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>123, Walker Street, Lenox, Berkshire, Massachu...</td>\n",
" <td>POINT (-73.27852398831919 42.35325245728)</td>\n",
" <td>The Egmonts</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" address \\\n",
"0 12, Sunset Avenue, Lenox, Berkshire, Massachus... \n",
"0 8, Franklin Street, Lenox, Berkshire, Massachu... \n",
"0 2, Kemble Street, Lenox, Berkshire, Massachuse... \n",
"0 45, West Street, Lenox, Berkshire, Massachuset... \n",
"0 2, Crystal Street, Lenox, Berkshire, Massachus... \n",
"0 172, Housatonic Street, Lenox, Berkshire, Mass... \n",
"0 123, Walker Street, Lenox, Berkshire, Massachu... \n",
"\n",
" geometry site \n",
"0 POINT (-73.285592038448 42.3584508418913) Pederson House \n",
"0 POINT (-73.2822653207234 42.359445166481) Haven \n",
"0 POINT (-73.282087 42.354224) Kemble Inn \n",
"0 POINT (-73.28859677553029 42.3568093607335) Tanglewood Institute \n",
"0 POINT (-73.246393 42.333106) Tanners Market \n",
"0 POINT (-73.27257299999999 42.355483) Berkshire Grain \n",
"0 POINT (-73.27852398831919 42.35325245728) The Egmonts "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"start_locations = [\n",
" {\n",
" 'address': '12 Sunset Ave, Lenox, MA, USA',\n",
" 'site': 'Pederson House'\n",
" }, {\n",
" 'address': '8 Franklin St, Lenox, MA, USA',\n",
" 'site': 'Haven'\n",
" }, {\n",
" 'address': '2 Kemble St, Lenox, MA, USA',\n",
" 'site': 'Kemble Inn'\n",
" }, {\n",
" 'address': '45 West St, Lenox, MA, USA',\n",
" 'site': 'Tanglewood Institute'\n",
" }, {\n",
" 'address': '2 Crystal St, Lenox Dale, MA, USA',\n",
" 'site': 'Tanners Market'\n",
" }, {\n",
" 'address': '172 Housatonic St, Lenox, MA, USA',\n",
" 'site': 'Berkshire Grain'\n",
" }, {\n",
" 'address': '123 Walker St, Lenox, MA, USA',\n",
" 'site': 'The Egmonts'\n",
" }\n",
" \n",
"]\n",
"\n",
"start_gdf = gpd.GeoDataFrame(crs = {'init': 4326})\n",
"start_gdf['address'] = None\n",
"start_gdf['site'] = None\n",
"start_gdf['geometry'] = None\n",
"\n",
"for location in start_locations:\n",
" location_gdf = gpd.tools.geocode(location['address'], provider = 'Nominatim', user_agent = 'prcr-ncc')\n",
" location_gdf['site'] = location['site']\n",
" start_gdf = start_gdf.append(location_gdf, sort = True)\n",
" \n",
"start_gdf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load park access points\n",
"\n",
"These are pre-generated park access points. Some parks have multiple access points so they have a unique id!"
]
},
{
"cell_type": "code",
"execution_count": 3,
"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>parkid</th>\n",
" <th>ap_id</th>\n",
" <th>name</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>101001</td>\n",
" <td>Community Center</td>\n",
" <td>POINT (-73.28231960535049 42.35542615467306)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>102001</td>\n",
" <td>Basketball Court</td>\n",
" <td>POINT (-73.28166514635086 42.35606835114605)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>103001</td>\n",
" <td>Lenox Town Beach</td>\n",
" <td>POINT (-73.26271533966064 42.32728595838694)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>104001</td>\n",
" <td>Orebed Park</td>\n",
" <td>POINT (-73.28073978424072 42.35763219103418)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>104002</td>\n",
" <td>Orebed Park</td>\n",
" <td>POINT (-73.28090876340866 42.35855382749465)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>5</td>\n",
" <td>105001</td>\n",
" <td>Tennis Courts</td>\n",
" <td>POINT (-73.28138887882233 42.35653810181761)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>5</td>\n",
" <td>105002</td>\n",
" <td>Tennis Courts</td>\n",
" <td>POINT (-73.2814948260784 42.3561367327913)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>6</td>\n",
" <td>106001</td>\n",
" <td>Tillotson Park</td>\n",
" <td>POINT (-73.2478156685829 42.33351420684395)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>7</td>\n",
" <td>107001</td>\n",
" <td>Lilac Park</td>\n",
" <td>POINT (-73.28508496284485 42.35831202310762)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>7</td>\n",
" <td>107002</td>\n",
" <td>Lilac Park</td>\n",
" <td>POINT (-73.28457802534103 42.35853797149778)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>3</td>\n",
" <td>103002</td>\n",
" <td>Lenox Town Beach</td>\n",
" <td>POINT (-73.2631927728653 42.32797405052087)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>8</td>\n",
" <td>108001</td>\n",
" <td>Veterans Memorial Park</td>\n",
" <td>POINT (-73.27572137117386 42.35677793097526)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" parkid ap_id name \\\n",
"0 1 101001 Community Center \n",
"1 2 102001 Basketball Court \n",
"2 3 103001 Lenox Town Beach \n",
"3 4 104001 Orebed Park \n",
"4 4 104002 Orebed Park \n",
"5 5 105001 Tennis Courts \n",
"6 5 105002 Tennis Courts \n",
"7 6 106001 Tillotson Park \n",
"8 7 107001 Lilac Park \n",
"9 7 107002 Lilac Park \n",
"10 3 103002 Lenox Town Beach \n",
"11 8 108001 Veterans Memorial Park \n",
"\n",
" geometry \n",
"0 POINT (-73.28231960535049 42.35542615467306) \n",
"1 POINT (-73.28166514635086 42.35606835114605) \n",
"2 POINT (-73.26271533966064 42.32728595838694) \n",
"3 POINT (-73.28073978424072 42.35763219103418) \n",
"4 POINT (-73.28090876340866 42.35855382749465) \n",
"5 POINT (-73.28138887882233 42.35653810181761) \n",
"6 POINT (-73.2814948260784 42.3561367327913) \n",
"7 POINT (-73.2478156685829 42.33351420684395) \n",
"8 POINT (-73.28508496284485 42.35831202310762) \n",
"9 POINT (-73.28457802534103 42.35853797149778) \n",
"10 POINT (-73.2631927728653 42.32797405052087) \n",
"11 POINT (-73.27572137117386 42.35677793097526) "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pap_gdf = gpd.read_file('lenox_pap.geojson')\n",
"pap_gdf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get shortest routes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Functions\n",
"\n",
"We'll break this all up into a couple functions to help keep everything from getting out of hand...it's kind of already getting there as it is!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create an empty GeoDataFrame\n",
"\n",
"We actually need to do this twice in our analysis. We'll create an empty GeoDataFrame to store all our outputs from `get_shortest_routes()` (below) and each time that function finds the shortest routes between an origin and destination."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def empty_gdf(fields: list, crs_epsg: int):\n",
" \"\"\"Function to create an empty GeoDataFrame with columns and Coordinate Reference System set\n",
" \n",
" Example:\n",
" empty_gdf(['geometry', 'field1', 'field2', 'field3'], 4326)\n",
" \n",
" Args:\n",
" fields (list): list of field names\n",
" crs_epsg (int): EPSG code for coordinate reference system\n",
" Returns \n",
" GeoDataFrame: An empty Geopandas GeoDataFrame with columns and Coordinate Reference System set \n",
" \"\"\"\n",
" \n",
" empty_gdf = gpd.GeoDataFrame(crs = {'init': crs_epsg})\n",
" \n",
" if 'geometry' not in fields:\n",
" empty_gdf['geometry'] = None\n",
" \n",
" for field in fields:\n",
" empty_gdf[field] = None\n",
" \n",
" return empty_gdf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Get the shortest routes\n",
"\n",
"This function probably tries to do too much and takes a lot of inputs. But in the end, it adds the shortest routes to a previously generated empty GeoDataFrame that can be exported to any number of spatial data formats. Or we can do pandas and geopandas analysis. Nice!"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def get_shortest_routes(origin_gdf, origin_id_col, origin_name_col,\n",
" destination_gdf, destination_id_col, destination_park_id_col, destination_name_col,\n",
" output_gdf, search_distance = 804.672, network_type = 'walk', simplify = False):\n",
" for origin_index, origin_row in origin_gdf.iterrows():\n",
" print('Generating graph for {}'.format(origin_row[origin_name_col]))\n",
" G = ox.graph_from_point((origin_row.geometry.y, origin_row.geometry.x),\n",
" distance = search_distance * 2,\n",
" network_type = network_type,\n",
" simplify = simplify)\n",
"\n",
" # Create GeoDataFrames of nodes and edges from graph\n",
" nodes, edges = ox.graph_to_gdfs(G=G)\n",
"\n",
" # Loop through each park access point and generate the shortest path from the starting point to that access point\n",
" # Really, this needs to be constrained by a buffer, but that wasn't working properly\n",
" print('Generating shortest paths...')\n",
" for destination_index, destination_row in destination_gdf.iterrows():\n",
" origin_id = origin_row[origin_id_col]\n",
" park_name = destination_row[destination_name_col] \n",
" parkid = destination_row[destination_park_id_col]\n",
" ap_id = destination_row[destination_id_col]\n",
" \n",
" origin_point = (origin_row.geometry.y, origin_row.geometry.x)\n",
" destination_point = (destination_row.geometry.y, destination_row.geometry.x)\n",
" origin_node = ox.get_nearest_node(G, origin_point)\n",
" destination_node = ox.get_nearest_node(G, destination_point)\n",
"\n",
" route = nx.shortest_path(G, origin_node, destination_node, weight = 'length')\n",
" route_lengths = ox.get_route_edge_attributes(G, route, 'length')\n",
"\n",
" if len(route_lengths) > 0:\n",
" route_length = functools.reduce(lambda a, b: a + b, route_lengths)\n",
" else:\n",
" route_length = 0\n",
"\n",
" if route_length <= search_distance:\n",
" route_nodes = nodes.loc[route]\n",
" if route_nodes.shape[0] > 1:\n",
" route_line = LineString(list(route_nodes.geometry.values))\n",
" else:\n",
" route_line = LineString([route_nodes.geometry.values[0], route_nodes.geometry.values[0]])\n",
"\n",
" route_gdf = empty_gdf(route_fields, 4326)\n",
"\n",
" route_gdf.loc[0, 'geometry'] = route_line\n",
" route_gdf.loc[0, 'origin_id'] = origin_id\n",
" route_gdf.loc[0, 'destination_name'] = park_name\n",
" route_gdf.loc[0, 'destination_parkid'] = parkid\n",
" route_gdf.loc[0, 'destination_ap_id'] = ap_id\n",
" route_gdf.loc[0, 'length_m'] = route_length\n",
" route_gdf.loc[0, 'length_mi'] = route_length / 1609.344\n",
" \n",
" output_gdf = output_gdf.append(route_gdf)\n",
" \n",
" return output_gdf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Convert GeoDataFrames to GeoJSON\n",
"\n",
"Apparently you can do this explicitly with geopandas, but I was having trouble reliably doing so. It wasn't creating valid GeoJSON. Anyway, this function offers an alternative means for going from GeoDataFrame to GeoJSON."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def gdf_to_geojson(gdf):\n",
" gdf_json = gdf.to_json()\n",
" gdf_json = json.loads(gdf_json)\n",
" return gdf_json"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Run Analysis"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"route_fields = ['geometry', 'origin_id', 'destination_name', 'destination_parkid', 'destination_ap_id', 'length_m', 'length_mi']\n",
"shortest_routes_gdf = empty_gdf(route_fields, 4326)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generating graph for Pederson House\n",
"Generating shortest paths...\n",
"Generating graph for Haven\n",
"Generating shortest paths...\n",
"Generating graph for Kemble Inn\n",
"Generating shortest paths...\n",
"Generating graph for Tanglewood Institute\n",
"Generating shortest paths...\n",
"Generating graph for Tanners Market\n",
"Generating shortest paths...\n",
"Generating graph for Berkshire Grain\n",
"Generating shortest paths...\n",
"Generating graph for The Egmonts\n",
"Generating shortest paths...\n"
]
}
],
"source": [
"shortest_routes_gdf = get_shortest_routes(start_gdf, 'site', 'site', pap_gdf, 'ap_id', 'parkid', 'name', shortest_routes_gdf)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Map Results"
]
},
{
"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>geometry</th>\n",
" <th>origin_id</th>\n",
" <th>destination_name</th>\n",
" <th>destination_parkid</th>\n",
" <th>destination_ap_id</th>\n",
" <th>length_m</th>\n",
" <th>length_mi</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>LINESTRING (-73.2845657 42.3581118, -73.284585...</td>\n",
" <td>Pederson House</td>\n",
" <td>Community Center</td>\n",
" <td>1</td>\n",
" <td>101001</td>\n",
" <td>413.1</td>\n",
" <td>0.256688</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>LINESTRING (-73.2845657 42.3581118, -73.284585...</td>\n",
" <td>Pederson House</td>\n",
" <td>Basketball Court</td>\n",
" <td>2</td>\n",
" <td>102001</td>\n",
" <td>459.405</td>\n",
" <td>0.285461</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>LINESTRING (-73.2845657 42.3581118, -73.284585...</td>\n",
" <td>Pederson House</td>\n",
" <td>Orebed Park</td>\n",
" <td>4</td>\n",
" <td>104001</td>\n",
" <td>329.993</td>\n",
" <td>0.205048</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>LINESTRING (-73.2845657 42.3581118, -73.284585...</td>\n",
" <td>Pederson House</td>\n",
" <td>Orebed Park</td>\n",
" <td>4</td>\n",
" <td>104002</td>\n",
" <td>456.86</td>\n",
" <td>0.28388</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>LINESTRING (-73.2845657 42.3581118, -73.284585...</td>\n",
" <td>Pederson House</td>\n",
" <td>Tennis Courts</td>\n",
" <td>5</td>\n",
" <td>105001</td>\n",
" <td>400.426</td>\n",
" <td>0.248813</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" geometry origin_id \\\n",
"0 LINESTRING (-73.2845657 42.3581118, -73.284585... Pederson House \n",
"0 LINESTRING (-73.2845657 42.3581118, -73.284585... Pederson House \n",
"0 LINESTRING (-73.2845657 42.3581118, -73.284585... Pederson House \n",
"0 LINESTRING (-73.2845657 42.3581118, -73.284585... Pederson House \n",
"0 LINESTRING (-73.2845657 42.3581118, -73.284585... Pederson House \n",
"\n",
" destination_name destination_parkid destination_ap_id length_m length_mi \n",
"0 Community Center 1 101001 413.1 0.256688 \n",
"0 Basketball Court 2 102001 459.405 0.285461 \n",
"0 Orebed Park 4 104001 329.993 0.205048 \n",
"0 Orebed Park 4 104002 456.86 0.28388 \n",
"0 Tennis Courts 5 105001 400.426 0.248813 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shortest_routes_gdf.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgPHN0eWxlPiNtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwLjAlOwogICAgICAgIGhlaWdodDogMTAwLjAlOwogICAgICAgIGxlZnQ6IDAuMCU7CiAgICAgICAgdG9wOiAwLjAlOwogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1IiA+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIAogICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgCgogICAgdmFyIG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSA9IEwubWFwKAogICAgICAgICdtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUnLCB7CiAgICAgICAgY2VudGVyOiBbNDIuMzU2NDc1LCAtNzMuMjg0ODI4OV0sCiAgICAgICAgem9vbTogMTYsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKICAgIAogICAgCiAgICB2YXIgdGlsZV9sYXllcl84MWI2MTJiYTNkZGU0ZjE2YWMyZDhjZDE0MmJmYzU5YyA9IEwudGlsZUxheWVyKAogICAgICAgICdodHRwczovL2NhcnRvZGItYmFzZW1hcHMtYS5nbG9iYWwuc3NsLmZhc3RseS5uZXQvbGlnaHRfYWxsL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6ICImY29weTsgPGEgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDwvYT4gJmNvcHk7IDxhIGhyZWY9XCJodHRwOi8vY2FydG9kYi5jb20vYXR0cmlidXRpb25zXCI+Q2FydG9EQjwvYT4iLAogICAgICAgICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAgICAgICAibWF4TmF0aXZlWm9vbSI6IDE4LAogICAgICAgICJtYXhab29tIjogMTgsCiAgICAgICAgIm1pblpvb20iOiAwLAogICAgICAgICJub1dyYXAiOiBmYWxzZSwKICAgICAgICAic3ViZG9tYWlucyI6ICJhYmMiCn0pLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAKICAgICAgICAKICAgICAgICB2YXIgZ2VvX2pzb25fYTQwMWU0NDkxYjk2NGRjMWEwYTc5ZWE2Yjk4NTUxNTYgPSBMLmdlb0pzb24oCiAgICAgICAgICAgIHsiZmVhdHVyZXMiOiBbeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbW1stNzMuMjgyNTI2MTM1NDQ0NjQsIDQyLjM1NTYxMDQ4OTUxNzM3XSwgWy03My4yODIwMjcyNDQ1Njc4NywgNDIuMzU1MzA1MjQ2NTc4Mzc1XSwgWy03My4yODE1MTc2MjQ4NTUwNCwgNDIuMzU1ODQ4MzQwMTMwNDNdLCBbLTczLjI4MTY1MTczNTMwNTc5LCA0Mi4zNTU5MjM2NTkzMDM1Nl0sIFstNzMuMjgxODU1NTgzMTkwOTIsIDQyLjM1NTc0NTI3MTY0MTk3XSwgWy03My4yODIxOTg5MDU5NDQ4MSwgNDIuMzU1OTIzNjU5MzAzNTZdLCBbLTczLjI4MjUyNjEzNTQ0NDY0LCA0Mi4zNTU2MTA0ODk1MTczN11dXSwgInR5cGUiOiAiUG9seWdvbiJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJoaWdobGlnaHQiOiB7fSwgIm5hbWUiOiAiQ29tbXVuaXR5IENlbnRlciIsICJwYXJraWQiOiAxLCAic3R5bGUiOiB7ImNvbG9yIjogImdyZWVuIiwgImZpbGxPcGFjaXR5IjogMC44LCAid2VpZ2h0IjogMH19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1tbLTczLjI4MTk3ODk2NDgwNTU5LCA0Mi4zNTYwMDY5MDY3MDU2OF0sIFstNzMuMjgxNzQwMjQ4MjAzMjgsIDQyLjM1NTg3NjA4OTMwOTk5XSwgWy03My4yODE2MjQ5MTMyMTU2NCwgNDIuMzU1OTY1MjgzMDE4NDFdLCBbLTczLjI4MTg2ODk5NDIzNTk5LCA0Mi4zNTYxMDk5NzQ3NjUwNV0sIFstNzMuMjgxOTc4OTY0ODA1NTksIDQyLjM1NjAwNjkwNjcwNTY4XV1dLCAidHlwZSI6ICJQb2x5Z29uIn0sICJpZCI6ICIxIiwgInByb3BlcnRpZXMiOiB7ImhpZ2hsaWdodCI6IHt9LCAibmFtZSI6ICJCYXNrZXRiYWxsIENvdXJ0IiwgInBhcmtpZCI6IDIsICJzdHlsZSI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJ3ZWlnaHQiOiAwfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbW1stNzMuMjY4MTc2MzE3MjE0OTcsIDQyLjMyODQ4OTYxODk0NTEyXSwgWy03My4yNjgxODcwNDYwNTEwMywgNDIuMzI3OTEwNTk1NjUzNTM1XSwgWy03My4yNjcyNjk3MzA1Njc5MywgNDIuMzI4MzExMTUzNDMwMzFdLCBbLTczLjI2NjM5NTMzMDQyOTA4LCA0Mi4zMjgzNjY2NzYwODkxNzVdLCBbLTczLjI2NDc0MzA4OTY3NTksIDQyLjMyNzY4NDUzNzE2ODQ1XSwgWy03My4yNjQwNzI1Mzc0MjIxOCwgNDIuMzI2NzI0NzcxMDQ1NDVdLCBbLTczLjI2NDAxMzUyODgyMzg1LCA0Mi4zMjY3NzIzNjMwOTkwOV0sIFstNzMuMjYzNTU3NTUzMjkxMzIsIDQyLjMyNjcxNjgzOTAzMzAyNl0sIFstNzMuMjYzMjM1Njg4MjA5NTMsIDQyLjMyNjU1NDIzMjU1NzYyNl0sIFstNzMuMjYzMDUzMjk3OTk2NTIsIDQyLjMyNjYxNzY4ODc5MzE1Nl0sIFstNzMuMjYyOTg4OTI0OTgwMTYsIDQyLjMyNzc0NDAyNjMyMjI0XSwgWy03My4yNjM1ODQzNzUzODE0NywgNDIuMzI4Nzg3MDYwMzQ0NjldLCBbLTczLjI2NDI3NjM4NTMwNzMxLCA0Mi4zMjg2ODM5NDc0ODU0M10sIFstNzMuMjY2MzYzMTQzOTIwOSwgNDIuMzI5MTc5NjgwODM4NTE0XSwgWy03My4yNjgxNzYzMTcyMTQ5NywgNDIuMzI4NDg5NjE4OTQ1MTJdXV0sICJ0eXBlIjogIlBvbHlnb24ifSwgImlkIjogIjIiLCAicHJvcGVydGllcyI6IHsiaGlnaGxpZ2h0Ijoge30sICJuYW1lIjogIkxlbm94IFRvd24gQmVhY2giLCAicGFya2lkIjogMywgInN0eWxlIjogeyJjb2xvciI6ICJncmVlbiIsICJmaWxsT3BhY2l0eSI6IDAuOCwgIndlaWdodCI6IDB9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbWy03My4yODEzOTY5MjU0NDkzNywgNDIuMzU4NjMxMTI1NDIyMDg2XSwgWy03My4yODEzNzgxNDk5ODYyNywgNDIuMzU3OTM3NDIyNjcwOF0sIFstNzMuMjgxMTM2NzUxMTc0OTMsIDQyLjM1NzgxMDU3MzMzOTUzNV0sIFstNzMuMjgwODkyNjcwMTU0NTcsIDQyLjM1NzU5ODQ5NjU0MTg3XSwgWy03My4yODA3MjkwNTU0MDQ2NSwgNDIuMzU3Njc3Nzc3NjcxNDhdLCBbLTczLjI4MDY3NTQxMTIyNDM3LCA0Mi4zNTc3NTUwNzY2NzY1NzVdLCBbLTczLjI4MDY4MDc3NTY0MjQsIDQyLjM1ODA2NjI1Mzc2MDgxXSwgWy03My4yODA3NDUxNDg2NTg3NSwgNDIuMzU4MjgwMzEwOTg3ODddLCBbLTczLjI4MDkxMTQ0NTYxNzY2LCA0Mi4zNTg2MjUxNzk0MzEwNF0sIFstNzMuMjgxMzk2OTI1NDQ5MzcsIDQyLjM1ODYzMTEyNTQyMjA4Nl1dXSwgInR5cGUiOiAiUG9seWdvbiJ9LCAiaWQiOiAiMyIsICJwcm9wZXJ0aWVzIjogeyJoaWdobGlnaHQiOiB7fSwgIm5hbWUiOiAiT3JlYmVkIFBhcmsiLCAicGFya2lkIjogNCwgInN0eWxlIjogeyJjb2xvciI6ICJncmVlbiIsICJmaWxsT3BhY2l0eSI6IDAuOCwgIndlaWdodCI6IDB9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbWy03My4yODE0NjM5ODA2NzQ3NCwgNDIuMzU2MzI4MDAyNzk1MTY2XSwgWy03My4yODE0OTM0ODQ5NzM5MSwgNDIuMzU2MjU0NjY2MTc4NTZdLCBbLTczLjI4MTM4MzUxNDQwNDMsIDQyLjM1NjAzNDY1NTgxNTIxNV0sIFstNzMuMjgxMzA1NzMwMzQyODYsIDQyLjM1NjAxMjg1Mjk0NDQ4XSwgWy03My4yODA1MTE3OTY0NzQ0NiwgNDIuMzU2MjQwNzkxNjczOTA1XSwgWy03My4yODA0NzY5Mjc3NTcyNiwgNDIuMzU2Mjk4MjcxNzQ0Njg0XSwgWy03My4yODA2MTM3MjA0MTcwMiwgNDIuMzU2NTMwMTczNTY1MzddLCBbLTczLjI4MDY5MTUwNDQ3ODQ1LCA0Mi4zNTY1NDYwMzAwNjg4NTZdLCBbLTczLjI4MTQ2Mzk4MDY3NDc0LCA0Mi4zNTYzMjgwMDI3OTUxNjZdXV0sICJ0eXBlIjogIlBvbHlnb24ifSwgImlkIjogIjQiLCAicHJvcGVydGllcyI6IHsiaGlnaGxpZ2h0Ijoge30sICJuYW1lIjogIlRlbm5pcyBDb3VydHMiLCAicGFya2lkIjogNSwgInN0eWxlIjogeyJjb2xvciI6ICJncmVlbiIsICJmaWxsT3BhY2l0eSI6IDAuOCwgIndlaWdodCI6IDB9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbWy03My4yNDgzODY5NzkxMDMwOSwgNDIuMzM0NTAxNjI3OTkxMjRdLCBbLTczLjI0Nzc5Njg5MzExOTgxLCA0Mi4zMzQwMTc4MzMyMjE2MV0sIFstNzMuMjQ4MTk5MjI0NDcyMDUsIDQyLjMzMzg0MzM0ODk0ODldLCBbLTczLjI0Nzk3MzkxODkxNDgsIDQyLjMzMzYzMzE3NDA2ODZdLCBbLTczLjI0NzUyMzMwNzgwMDMsIDQyLjMzMzg5NDkwMTE3MDc3XSwgWy03My4yNDcwNTEyMzkwMTM2NywgNDIuMzMzNTU3ODI4MTg1NzhdLCBbLTczLjI0NjAyNjYzNTE2OTk4LCA0Mi4zMzQ4NzgzNTA4NDkzMTZdLCBbLTczLjI0NjkwMTAzNTMwODg0LCA0Mi4zMzUyOTA3NjA2NTM4OV0sIFstNzMuMjQ4MzA2NTEyODMyNjQsIDQyLjMzNDgzNDczMDQyMzM2XSwgWy03My4yNDgyMjA2ODIxNDQxNywgNDIuMzM0NTI1NDIxMDgwNl0sIFstNzMuMjQ4Mzg2OTc5MTAzMDksIDQyLjMzNDUwMTYyNzk5MTI0XV1dLCAidHlwZSI6ICJQb2x5Z29uIn0sICJpZCI6ICI1IiwgInByb3BlcnRpZXMiOiB7ImhpZ2hsaWdodCI6IHt9LCAibmFtZSI6ICJUaWxsb3Rzb24gUGFyayIsICJwYXJraWQiOiA2LCAic3R5bGUiOiB7ImNvbG9yIjogImdyZWVuIiwgImZpbGxPcGFjaXR5IjogMC44LCAid2VpZ2h0IjogMH19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1tbLTczLjI4NTA5MzAwOTQ3MTksIDQyLjM1OTM1MDU4NjE4NTVdLCBbLTczLjI4NTQ5NTM0MDgyNDEzLCA0Mi4zNTg0MDUxNzczNjY5MDVdLCBbLTczLjI4NDcxNDgxODAwMDgsIDQyLjM1ODE4NTE3NDUzMjU0NF0sIFstNzMuMjg0NjIwOTQwNjg1MjcsIDQyLjM1ODIwODk1ODY1OTg2Nl0sIFstNzMuMjg0NDQxMjMyNjgxMjcsIDQyLjM1ODYzMzEwNzQxODk2XSwgWy03My4yODQ5NjE1ODEyMzAxNiwgNDIuMzU4Nzk3NjEyOTQyODddLCBbLTczLjI4NDc5Nzk2NjQ4MDI0LCA0Mi4zNTkxMjY2MjI2OTg2NV0sIFstNzMuMjg0NTU5MjQ5ODc3OTMsIDQyLjM1OTE0MjQ3ODU0N10sIFstNzMuMjg0NTY0NjE0Mjk1OTYsIDQyLjM1OTM5NDE4OTYwMzQxXSwgWy03My4yODUwOTMwMDk0NzE5LCA0Mi4zNTkzNTA1ODYxODU1XV1dLCAidHlwZSI6ICJQb2x5Z29uIn0sICJpZCI6ICI2IiwgInByb3BlcnRpZXMiOiB7ImhpZ2hsaWdodCI6IHt9LCAibmFtZSI6ICJMaWxhYyBQYXJrIiwgInBhcmtpZCI6IDcsICJzdHlsZSI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJ3ZWlnaHQiOiAwfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbW1stNzMuMjc2NTI4NzE2MDg3MzQsIDQyLjM1ODU5OTQxMzQ2MzM1XSwgWy03My4yNzY2NjgxOTA5NTYxMiwgNDIuMzU4MTU5NDA4Mzg0NDI0XSwgWy03My4yNzY1OTg0NTM1MjE3MywgNDIuMzU3NDI2MDU5NzM5NThdLCBbLTczLjI3NTg3OTYyMTUwNTc0LCA0Mi4zNTczMjI5OTM4Mzg3MTRdLCBbLTczLjI3NTkzMzI2NTY4NjA0LCA0Mi4zNTY3OTE4MDUzNjEzMjVdLCBbLTczLjI3NTc3NzY5NzU2MzE3LCA0Mi4zNTY2MDE1Mjc3OTk1N10sIFstNzMuMjc1NzY2OTY4NzI3MTEsIDQyLjM1NjE2MTUwODczMTM1XSwgWy03My4yNzQ4MTc0NjY3MzU4NCwgNDIuMzU2MjA5MDc4NTA4ODddLCBbLTczLjI3NDMzNDY2OTExMzE2LCA0Mi4zNTg1MTYxNjk0OTU1Ml0sIFstNzMuMjc2NTI4NzE2MDg3MzQsIDQyLjM1ODU5OTQxMzQ2MzM1XV1dLCAidHlwZSI6ICJQb2x5Z29uIn0sICJpZCI6ICI3IiwgInByb3BlcnRpZXMiOiB7ImhpZ2hsaWdodCI6IHt9LCAibmFtZSI6ICJWZXRlcmFucyBNZW1vcmlhbCBQYXJrIiwgInBhcmtpZCI6IDgsICJzdHlsZSI6IHsiY29sb3IiOiAiZ3JlZW4iLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJ3ZWlnaHQiOiAwfX0sICJ0eXBlIjogIkZlYXR1cmUifV0sICJ0eXBlIjogIkZlYXR1cmVDb2xsZWN0aW9uIn0KICAgICAgICAgICAgCiAgICAgICAgICAgICkuYWRkVG8obWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1KTsKICAgICAgICBnZW9fanNvbl9hNDAxZTQ0OTFiOTY0ZGMxYTBhNzllYTZiOTg1NTE1Ni5zZXRTdHlsZShmdW5jdGlvbihmZWF0dXJlKSB7cmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5zdHlsZTt9KTsKICAgICAgICAKICAgIAogICAgICAgIAogICAgICAgIHZhciBnZW9fanNvbl8xMjE0ODQ0OTdkOTg0Nzc1OTJiMzcyODMzNTM3ZTk4MyA9IEwuZ2VvSnNvbigKICAgICAgICAgICAgeyJmZWF0dXJlcyI6IFt7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdLCBbLTczLjI4NDU4NTcsIDQyLjM1ODA2MTNdLCBbLTczLjI4NDk0MiwgNDIuMzU3MzA5XSwgWy03My4yODQ5ODA0LCA0Mi4zNTcyMzkzXSwgWy03My4yODQ5OTg4LCA0Mi4zNTcxNTg5XSwgWy03My4yODQ5OTkyLCA0Mi4zNTcwNzY3XSwgWy03My4yODQ5Njg2LCA0Mi4zNTY5Nzk1XSwgWy03My4yODQ4ODUsIDQyLjM1Njg3NzJdLCBbLTczLjI4NDgwOTMsIDQyLjM1NjgxNDVdLCBbLTczLjI4NDcxOCwgNDIuMzU2NzUxXSwgWy03My4yODM3OTQsIDQyLjM1NjIxXSwgWy03My4yODMwNTEsIDQyLjM1NTc3N10sIFstNzMuMjgyMzUxLCA0Mi4zNTUzNjddXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwMTAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiQ29tbXVuaXR5IENlbnRlciIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiAxLCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDQxMy4wOTk5OTk5OTk5OTk5NywgImxlbmd0aF9taSI6IDAuMjU2Njg4NDM5NTEzMjQyNjYsICJvcmlnaW5faWQiOiAiUGVkZXJzb24gSG91c2UiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdLCBbLTczLjI4NDU4NTcsIDQyLjM1ODA2MTNdLCBbLTczLjI4NDQwODIsIDQyLjM1ODAxNzJdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MjA5NDEsIDQyLjM1NzUwNjldLCBbLTczLjI4MTk3NCwgNDIuMzU3NDk1XSwgWy03My4yODE4NTY1LCA0Mi4zNTc0OTQyXSwgWy03My4yODEzNDYsIDQyLjM1NzUxNjVdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MTE4MSwgNDIuMzU3MTE3XSwgWy03My4yODExODYsIDQyLjM1NjkxM10sIFstNzMuMjgxMTk5LCA0Mi4zNTY4Nl0sIFstNzMuMjgxMjIyLCA0Mi4zNTY3OThdLCBbLTczLjI4MTM3NCwgNDIuMzU2NTk1XSwgWy03My4yODE1NDMsIDQyLjM1NjM2OV0sIFstNzMuMjgxNTU1LCA0Mi4zNTYzNTZdLCBbLTczLjI4MTU2NSwgNDIuMzU2MzMxXSwgWy03My4yODE1NzEsIDQyLjM1NjMwNl0sIFstNzMuMjgxNTc3LCA0Mi4zNTYyN10sIFstNzMuMjgxNTc4LCA0Mi4zNTYyMThdLCBbLTczLjI4MTU3MywgNDIuMzU2MTU3XSwgWy03My4yODE1NTUsIDQyLjM1NjEwM11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTAyMDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJCYXNrZXRiYWxsIENvdXJ0IiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDIsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNDU5LjQwNTAwMDAwMDAwMDAzLCAibGVuZ3RoX21pIjogMC4yODU0NjEwMzI1Njk3OTI0NCwgIm9yaWdpbl9pZCI6ICJQZWRlcnNvbiBIb3VzZSIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjg0NTY1NywgNDIuMzU4MTExOF0sIFstNzMuMjg0NTg1NywgNDIuMzU4MDYxM10sIFstNzMuMjg0NDA4MiwgNDIuMzU4MDE3Ml0sIFstNzMuMjgyOTU0MSwgNDIuMzU3NjU1OV0sIFstNzMuMjgyMDk0MSwgNDIuMzU3NTA2OV0sIFstNzMuMjgxOTc0LCA0Mi4zNTc0OTVdLCBbLTczLjI4MTg1NjUsIDQyLjM1NzQ5NDJdLCBbLTczLjI4MTM0NiwgNDIuMzU3NTE2NV0sIFstNzMuMjgxMTc5NiwgNDIuMzU3NTA5MV0sIFstNzMuMjgwOTI5NiwgNDIuMzU3NTI0XSwgWy03My4yODA4NDIzLCA0Mi4zNTc1NDQ0XSwgWy03My4yODA3NzIxLCA0Mi4zNTc1NzQzXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDQwMDEsICJkZXN0aW5hdGlvbl9uYW1lIjogIk9yZWJlZCBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDQsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogMzI5Ljk5MywgImxlbmd0aF9taSI6IDAuMjA1MDQ4MTQzODM5OTc0NTUsICJvcmlnaW5faWQiOiAiUGVkZXJzb24gSG91c2UiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdLCBbLTczLjI4NDU4NTcsIDQyLjM1ODA2MTNdLCBbLTczLjI4NDQwODIsIDQyLjM1ODAxNzJdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MjA5NDEsIDQyLjM1NzUwNjldLCBbLTczLjI4MTk3NCwgNDIuMzU3NDk1XSwgWy03My4yODE4NTY1LCA0Mi4zNTc0OTQyXSwgWy03My4yODEzNDYsIDQyLjM1NzUxNjVdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MDkyOTYsIDQyLjM1NzUyNF0sIFstNzMuMjgwODQyMywgNDIuMzU3NTQ0NF0sIFstNzMuMjgwNzcyMSwgNDIuMzU3NTc0M10sIFstNzMuMjgwNjUyNiwgNDIuMzU3NTk5OF0sIFstNzMuMjgwNjM2LCA0Mi4zNTc3MjddLCBbLTczLjI4MDYyMSwgNDIuMzU3ODgxXSwgWy03My4yODA2MjUsIDQyLjM1ODA0NV0sIFstNzMuMjgwNjUzLCA0Mi4zNTgyMDhdLCBbLTczLjI4MDY5MywgNDIuMzU4MzQxXSwgWy03My4yODA3NjUsIDQyLjM1ODQ2OV0sIFstNzMuMjgwNzcyLCA0Mi4zNTg0ODNdLCBbLTczLjI4MDg0NywgNDIuMzU4NjIxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDQwMDIsICJkZXN0aW5hdGlvbl9uYW1lIjogIk9yZWJlZCBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDQsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNDU2Ljg1OTk5OTk5OTk5OTk2LCAibGVuZ3RoX21pIjogMC4yODM4Nzk2NDI4ODU1NDgzNCwgIm9yaWdpbl9pZCI6ICJQZWRlcnNvbiBIb3VzZSIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjg0NTY1NywgNDIuMzU4MTExOF0sIFstNzMuMjg0NTg1NywgNDIuMzU4MDYxM10sIFstNzMuMjg0NDA4MiwgNDIuMzU4MDE3Ml0sIFstNzMuMjgyOTU0MSwgNDIuMzU3NjU1OV0sIFstNzMuMjgyMDk0MSwgNDIuMzU3NTA2OV0sIFstNzMuMjgxOTc0LCA0Mi4zNTc0OTVdLCBbLTczLjI4MTg1NjUsIDQyLjM1NzQ5NDJdLCBbLTczLjI4MTM0NiwgNDIuMzU3NTE2NV0sIFstNzMuMjgxMTc5NiwgNDIuMzU3NTA5MV0sIFstNzMuMjgxMTgxLCA0Mi4zNTcxMTddLCBbLTczLjI4MTE4NiwgNDIuMzU2OTEzXSwgWy03My4yODExOTksIDQyLjM1Njg2XSwgWy03My4yODEyMjIsIDQyLjM1Njc5OF0sIFstNzMuMjgxMzc0LCA0Mi4zNTY1OTVdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNTAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiVGVubmlzIENvdXJ0cyIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA1LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDQwMC40MjYsICJsZW5ndGhfbWkiOiAwLjI0ODgxMzE4MTAyMjgyNjY4LCAib3JpZ2luX2lkIjogIlBlZGVyc29uIEhvdXNlIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODQ1NjU3LCA0Mi4zNTgxMTE4XSwgWy03My4yODQ1ODU3LCA0Mi4zNTgwNjEzXSwgWy03My4yODQ0MDgyLCA0Mi4zNTgwMTcyXSwgWy03My4yODI5NTQxLCA0Mi4zNTc2NTU5XSwgWy03My4yODIwOTQxLCA0Mi4zNTc1MDY5XSwgWy03My4yODE5NzQsIDQyLjM1NzQ5NV0sIFstNzMuMjgxODU2NSwgNDIuMzU3NDk0Ml0sIFstNzMuMjgxMzQ2LCA0Mi4zNTc1MTY1XSwgWy03My4yODExNzk2LCA0Mi4zNTc1MDkxXSwgWy03My4yODExODEsIDQyLjM1NzExN10sIFstNzMuMjgxMTg2LCA0Mi4zNTY5MTNdLCBbLTczLjI4MTE5OSwgNDIuMzU2ODZdLCBbLTczLjI4MTIyMiwgNDIuMzU2Nzk4XSwgWy03My4yODEzNzQsIDQyLjM1NjU5NV0sIFstNzMuMjgxNTQzLCA0Mi4zNTYzNjldLCBbLTczLjI4MTU1NSwgNDIuMzU2MzU2XSwgWy03My4yODE1NjUsIDQyLjM1NjMzMV0sIFstNzMuMjgxNTcxLCA0Mi4zNTYzMDZdLCBbLTczLjI4MTU3NywgNDIuMzU2MjddLCBbLTczLjI4MTU3OCwgNDIuMzU2MjE4XSwgWy03My4yODE1NzMsIDQyLjM1NjE1N10sIFstNzMuMjgxNTU1LCA0Mi4zNTYxMDNdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNTAwMiwgImRlc3RpbmF0aW9uX25hbWUiOiAiVGVubmlzIENvdXJ0cyIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA1LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDQ1OS40MDUwMDAwMDAwMDAwMywgImxlbmd0aF9taSI6IDAuMjg1NDYxMDMyNTY5NzkyNDQsICJvcmlnaW5faWQiOiAiUGVkZXJzb24gSG91c2UiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdLCBbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNzAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiTGlsYWMgUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA3LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDAsICJsZW5ndGhfbWkiOiAwLjAsICJvcmlnaW5faWQiOiAiUGVkZXJzb24gSG91c2UiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdLCBbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNzAwMiwgImRlc3RpbmF0aW9uX25hbWUiOiAiTGlsYWMgUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA3LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDAsICJsZW5ndGhfbWkiOiAwLjAsICJvcmlnaW5faWQiOiAiUGVkZXJzb24gSG91c2UiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4MjE0NjksIDQyLjM1OTQ5OTldLCBbLTczLjI4MjExMzIsIDQyLjM1OTQ1MDldLCBbLTczLjI4MjEyMTMsIDQyLjM1OTM5MTJdLCBbLTczLjI4MjE3OTEsIDQyLjM1OTI4MV0sIFstNzMuMjgyNDk4NCwgNDIuMzU4NjRdLCBbLTczLjI4MjcyODMsIDQyLjM1ODE0MTNdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MzE2NiwgNDIuMzU3MjExXSwgWy03My4yODM0MjQsIDQyLjM1NjY3Ml0sIFstNzMuMjgzNDgyLCA0Mi4zNTY1NjNdLCBbLTczLjI4MzYyNSwgNDIuMzU2MzM5XSwgWy03My4yODM2OSwgNDIuMzU2MjU1XSwgWy03My4yODM3OTQsIDQyLjM1NjIxXSwgWy03My4yODMwNTEsIDQyLjM1NTc3N10sIFstNzMuMjgyMzUxLCA0Mi4zNTUzNjddXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwMTAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiQ29tbXVuaXR5IENlbnRlciIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiAxLCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDU0NS45MjcsICJsZW5ndGhfbWkiOiAwLjMzOTIyMzMxMDg2NDU1MTA0LCAib3JpZ2luX2lkIjogIkhhdmVuIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODIxNDY5LCA0Mi4zNTk0OTk5XSwgWy03My4yODIxMTMyLCA0Mi4zNTk0NTA5XSwgWy03My4yODIxMjEzLCA0Mi4zNTkzOTEyXSwgWy03My4yODIxNzkxLCA0Mi4zNTkyODFdLCBbLTczLjI4MTg0MDQsIDQyLjM1OTE5NDJdLCBbLTczLjI4MTcwNTcsIDQyLjM1OTE3MzZdLCBbLTczLjI4MTU5MDksIDQyLjM1OTE1OV0sIFstNzMuMjgxMzUwMywgNDIuMzU5MTM5NV0sIFstNzMuMjgxMDM1LCA0Mi4zNTkxMjRdLCBbLTczLjI4MTAzLCA0Mi4zNTg5OTRdLCBbLTczLjI4MTAwNSwgNDIuMzU4OTAxXSwgWy03My4yODA5NDEsIDQyLjM1ODc3MV0sIFstNzMuMjgwODQ3LCA0Mi4zNTg2MjFdLCBbLTczLjI4MDc3MiwgNDIuMzU4NDgzXSwgWy03My4yODA3NjUsIDQyLjM1ODQ2OV0sIFstNzMuMjgwNjkzLCA0Mi4zNTgzNDFdLCBbLTczLjI4MDY1MywgNDIuMzU4MjA4XSwgWy03My4yODA2MjUsIDQyLjM1ODA0NV0sIFstNzMuMjgwNjIxLCA0Mi4zNTc4ODFdLCBbLTczLjI4MDYzNiwgNDIuMzU3NzI3XSwgWy03My4yODA2NTI2LCA0Mi4zNTc1OTk4XSwgWy03My4yODA3NzIxLCA0Mi4zNTc1NzQzXSwgWy03My4yODA4NDIzLCA0Mi4zNTc1NDQ0XSwgWy03My4yODA5Mjk2LCA0Mi4zNTc1MjRdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MTE4MSwgNDIuMzU3MTE3XSwgWy03My4yODExODYsIDQyLjM1NjkxM10sIFstNzMuMjgxMTk5LCA0Mi4zNTY4Nl0sIFstNzMuMjgxMjIyLCA0Mi4zNTY3OThdLCBbLTczLjI4MTM3NCwgNDIuMzU2NTk1XSwgWy03My4yODE1NDMsIDQyLjM1NjM2OV0sIFstNzMuMjgxNTU1LCA0Mi4zNTYzNTZdLCBbLTczLjI4MTU2NSwgNDIuMzU2MzMxXSwgWy03My4yODE1NzEsIDQyLjM1NjMwNl0sIFstNzMuMjgxNTc3LCA0Mi4zNTYyN10sIFstNzMuMjgxNTc4LCA0Mi4zNTYyMThdLCBbLTczLjI4MTU3MywgNDIuMzU2MTU3XSwgWy03My4yODE1NTUsIDQyLjM1NjEwM11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTAyMDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJCYXNrZXRiYWxsIENvdXJ0IiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDIsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNTA2LjczMzAwMDAwMDAwMDEsICJsZW5ndGhfbWkiOiAwLjMxNDg2OTI4ODM1NjAwMTAzLCAib3JpZ2luX2lkIjogIkhhdmVuIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODIxNDY5LCA0Mi4zNTk0OTk5XSwgWy03My4yODIxMTMyLCA0Mi4zNTk0NTA5XSwgWy03My4yODIxMjEzLCA0Mi4zNTkzOTEyXSwgWy03My4yODIxNzkxLCA0Mi4zNTkyODFdLCBbLTczLjI4MTg0MDQsIDQyLjM1OTE5NDJdLCBbLTczLjI4MTcwNTcsIDQyLjM1OTE3MzZdLCBbLTczLjI4MTU5MDksIDQyLjM1OTE1OV0sIFstNzMuMjgxMzUwMywgNDIuMzU5MTM5NV0sIFstNzMuMjgxMDM1LCA0Mi4zNTkxMjRdLCBbLTczLjI4MTAzLCA0Mi4zNTg5OTRdLCBbLTczLjI4MTAwNSwgNDIuMzU4OTAxXSwgWy03My4yODA5NDEsIDQyLjM1ODc3MV0sIFstNzMuMjgwODQ3LCA0Mi4zNTg2MjFdLCBbLTczLjI4MDc3MiwgNDIuMzU4NDgzXSwgWy03My4yODA3NjUsIDQyLjM1ODQ2OV0sIFstNzMuMjgwNjkzLCA0Mi4zNTgzNDFdLCBbLTczLjI4MDY1MywgNDIuMzU4MjA4XSwgWy03My4yODA2MjUsIDQyLjM1ODA0NV0sIFstNzMuMjgwNjIxLCA0Mi4zNTc4ODFdLCBbLTczLjI4MDYzNiwgNDIuMzU3NzI3XSwgWy03My4yODA2NTI2LCA0Mi4zNTc1OTk4XSwgWy03My4yODA3NzIxLCA0Mi4zNTc1NzQzXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDQwMDEsICJkZXN0aW5hdGlvbl9uYW1lIjogIk9yZWJlZCBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDQsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogMzA3Ljc0MTAwMDAwMDAwMDA0LCAibGVuZ3RoX21pIjogMC4xOTEyMjEzOTIwNzAzMDk0MSwgIm9yaWdpbl9pZCI6ICJIYXZlbiIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjgyMTQ2OSwgNDIuMzU5NDk5OV0sIFstNzMuMjgyMTEzMiwgNDIuMzU5NDUwOV0sIFstNzMuMjgyMTIxMywgNDIuMzU5MzkxMl0sIFstNzMuMjgyMTc5MSwgNDIuMzU5MjgxXSwgWy03My4yODE4NDA0LCA0Mi4zNTkxOTQyXSwgWy03My4yODE3MDU3LCA0Mi4zNTkxNzM2XSwgWy03My4yODE1OTA5LCA0Mi4zNTkxNTldLCBbLTczLjI4MTM1MDMsIDQyLjM1OTEzOTVdLCBbLTczLjI4MTAzNSwgNDIuMzU5MTI0XSwgWy03My4yODEwMywgNDIuMzU4OTk0XSwgWy03My4yODEwMDUsIDQyLjM1ODkwMV0sIFstNzMuMjgwOTQxLCA0Mi4zNTg3NzFdLCBbLTczLjI4MDg0NywgNDIuMzU4NjIxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDQwMDIsICJkZXN0aW5hdGlvbl9uYW1lIjogIk9yZWJlZCBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDQsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogMTgwLjg3NDAwMDAwMDAwMDAyLCAibGVuZ3RoX21pIjogMC4xMTIzODk4OTMwMjQ3MzU1NSwgIm9yaWdpbl9pZCI6ICJIYXZlbiIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjgyMTQ2OSwgNDIuMzU5NDk5OV0sIFstNzMuMjgyMTEzMiwgNDIuMzU5NDUwOV0sIFstNzMuMjgyMTIxMywgNDIuMzU5MzkxMl0sIFstNzMuMjgyMTc5MSwgNDIuMzU5MjgxXSwgWy03My4yODE4NDA0LCA0Mi4zNTkxOTQyXSwgWy03My4yODE3MDU3LCA0Mi4zNTkxNzM2XSwgWy03My4yODE1OTA5LCA0Mi4zNTkxNTldLCBbLTczLjI4MTM1MDMsIDQyLjM1OTEzOTVdLCBbLTczLjI4MTAzNSwgNDIuMzU5MTI0XSwgWy03My4yODEwMywgNDIuMzU4OTk0XSwgWy03My4yODEwMDUsIDQyLjM1ODkwMV0sIFstNzMuMjgwOTQxLCA0Mi4zNTg3NzFdLCBbLTczLjI4MDg0NywgNDIuMzU4NjIxXSwgWy03My4yODA3NzIsIDQyLjM1ODQ4M10sIFstNzMuMjgwNzY1LCA0Mi4zNTg0NjldLCBbLTczLjI4MDY5MywgNDIuMzU4MzQxXSwgWy03My4yODA2NTMsIDQyLjM1ODIwOF0sIFstNzMuMjgwNjI1LCA0Mi4zNTgwNDVdLCBbLTczLjI4MDYyMSwgNDIuMzU3ODgxXSwgWy03My4yODA2MzYsIDQyLjM1NzcyN10sIFstNzMuMjgwNjUyNiwgNDIuMzU3NTk5OF0sIFstNzMuMjgwNzcyMSwgNDIuMzU3NTc0M10sIFstNzMuMjgwODQyMywgNDIuMzU3NTQ0NF0sIFstNzMuMjgwOTI5NiwgNDIuMzU3NTI0XSwgWy03My4yODExNzk2LCA0Mi4zNTc1MDkxXSwgWy03My4yODExODEsIDQyLjM1NzExN10sIFstNzMuMjgxMTg2LCA0Mi4zNTY5MTNdLCBbLTczLjI4MTE5OSwgNDIuMzU2ODZdLCBbLTczLjI4MTIyMiwgNDIuMzU2Nzk4XSwgWy03My4yODEzNzQsIDQyLjM1NjU5NV1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA1MDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJUZW5uaXMgQ291cnRzIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDUsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNDQ3Ljc1NDAwMDAwMDAwMDEsICJsZW5ndGhfbWkiOiAwLjI3ODIyMTQzNjgwOTAzNTI3LCAib3JpZ2luX2lkIjogIkhhdmVuIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODIxNDY5LCA0Mi4zNTk0OTk5XSwgWy03My4yODIxMTMyLCA0Mi4zNTk0NTA5XSwgWy03My4yODIxMjEzLCA0Mi4zNTkzOTEyXSwgWy03My4yODIxNzkxLCA0Mi4zNTkyODFdLCBbLTczLjI4MTg0MDQsIDQyLjM1OTE5NDJdLCBbLTczLjI4MTcwNTcsIDQyLjM1OTE3MzZdLCBbLTczLjI4MTU5MDksIDQyLjM1OTE1OV0sIFstNzMuMjgxMzUwMywgNDIuMzU5MTM5NV0sIFstNzMuMjgxMDM1LCA0Mi4zNTkxMjRdLCBbLTczLjI4MTAzLCA0Mi4zNTg5OTRdLCBbLTczLjI4MTAwNSwgNDIuMzU4OTAxXSwgWy03My4yODA5NDEsIDQyLjM1ODc3MV0sIFstNzMuMjgwODQ3LCA0Mi4zNTg2MjFdLCBbLTczLjI4MDc3MiwgNDIuMzU4NDgzXSwgWy03My4yODA3NjUsIDQyLjM1ODQ2OV0sIFstNzMuMjgwNjkzLCA0Mi4zNTgzNDFdLCBbLTczLjI4MDY1MywgNDIuMzU4MjA4XSwgWy03My4yODA2MjUsIDQyLjM1ODA0NV0sIFstNzMuMjgwNjIxLCA0Mi4zNTc4ODFdLCBbLTczLjI4MDYzNiwgNDIuMzU3NzI3XSwgWy03My4yODA2NTI2LCA0Mi4zNTc1OTk4XSwgWy03My4yODA3NzIxLCA0Mi4zNTc1NzQzXSwgWy03My4yODA4NDIzLCA0Mi4zNTc1NDQ0XSwgWy03My4yODA5Mjk2LCA0Mi4zNTc1MjRdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MTE4MSwgNDIuMzU3MTE3XSwgWy03My4yODExODYsIDQyLjM1NjkxM10sIFstNzMuMjgxMTk5LCA0Mi4zNTY4Nl0sIFstNzMuMjgxMjIyLCA0Mi4zNTY3OThdLCBbLTczLjI4MTM3NCwgNDIuMzU2NTk1XSwgWy03My4yODE1NDMsIDQyLjM1NjM2OV0sIFstNzMuMjgxNTU1LCA0Mi4zNTYzNTZdLCBbLTczLjI4MTU2NSwgNDIuMzU2MzMxXSwgWy03My4yODE1NzEsIDQyLjM1NjMwNl0sIFstNzMuMjgxNTc3LCA0Mi4zNTYyN10sIFstNzMuMjgxNTc4LCA0Mi4zNTYyMThdLCBbLTczLjI4MTU3MywgNDIuMzU2MTU3XSwgWy03My4yODE1NTUsIDQyLjM1NjEwM11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA1MDAyLCAiZGVzdGluYXRpb25fbmFtZSI6ICJUZW5uaXMgQ291cnRzIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDUsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNTA2LjczMzAwMDAwMDAwMDEsICJsZW5ndGhfbWkiOiAwLjMxNDg2OTI4ODM1NjAwMTAzLCAib3JpZ2luX2lkIjogIkhhdmVuIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODIxNDY5LCA0Mi4zNTk0OTk5XSwgWy03My4yODIyNDM3LCA0Mi4zNTk1NTI5XSwgWy03My4yODI0LCA0Mi4zNTk1OTk5XSwgWy03My4yODM3MDMsIDQyLjM1OTkyNF0sIFstNzMuMjgzOTY5NywgNDIuMzU5MzY5Nl0sIFstNzMuMjg0MDMyLCA0Mi4zNTkyNF0sIFstNzMuMjg0MTk3MywgNDIuMzU4ODkwNV0sIFstNzMuMjg0NTY1NywgNDIuMzU4MTExOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA3MDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJMaWxhYyBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDcsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogMzUwLjM0MSwgImxlbmd0aF9taSI6IDAuMjE3NjkxODA0ODU5NjE5OCwgIm9yaWdpbl9pZCI6ICJIYXZlbiIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjgyMTQ2OSwgNDIuMzU5NDk5OV0sIFstNzMuMjgyMjQzNywgNDIuMzU5NTUyOV0sIFstNzMuMjgyNCwgNDIuMzU5NTk5OV0sIFstNzMuMjgzNzAzLCA0Mi4zNTk5MjRdLCBbLTczLjI4Mzk2OTcsIDQyLjM1OTM2OTZdLCBbLTczLjI4NDAzMiwgNDIuMzU5MjRdLCBbLTczLjI4NDE5NzMsIDQyLjM1ODg5MDVdLCBbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNzAwMiwgImRlc3RpbmF0aW9uX25hbWUiOiAiTGlsYWMgUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA3LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDM1MC4zNDEsICJsZW5ndGhfbWkiOiAwLjIxNzY5MTgwNDg1OTYxOTgsICJvcmlnaW5faWQiOiAiSGF2ZW4iLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4MjA4OTcsIDQyLjM1NDExNTFdLCBbLTczLjI4MjE4MjgsIDQyLjM1NDQwNzRdLCBbLTczLjI4MjE4NzMsIDQyLjM1NDQyMTVdLCBbLTczLjI4MjM5NzgsIDQyLjM1NTA3NzhdLCBbLTczLjI4MjI3MjIsIDQyLjM1NTEyNjldLCBbLTczLjI4MjM1MSwgNDIuMzU1MzY3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDEwMDEsICJkZXN0aW5hdGlvbl9uYW1lIjogIkNvbW11bml0eSBDZW50ZXIiLCAiZGVzdGluYXRpb25fcGFya2lkIjogMSwgImhpZ2hsaWdodCI6IHt9LCAibGVuZ3RoX20iOiAxNDkuMTQ5LCAibGVuZ3RoX21pIjogMC4wOTI2NzY4OTE5NTEwMDYxMiwgIm9yaWdpbl9pZCI6ICJLZW1ibGUgSW5uIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODIwODk3LCA0Mi4zNTQxMTUxXSwgWy03My4yODIxODI4LCA0Mi4zNTQ0MDc0XSwgWy03My4yODIxODczLCA0Mi4zNTQ0MjE1XSwgWy03My4yODIzOTc4LCA0Mi4zNTUwNzc4XSwgWy03My4yODIyNzIyLCA0Mi4zNTUxMjY5XSwgWy03My4yODIzNTEsIDQyLjM1NTM2N10sIFstNzMuMjgzMDUxLCA0Mi4zNTU3NzddLCBbLTczLjI4Mzc5NCwgNDIuMzU2MjFdLCBbLTczLjI4MzY5LCA0Mi4zNTYyNTVdLCBbLTczLjI4MzYyNSwgNDIuMzU2MzM5XSwgWy03My4yODM0ODIsIDQyLjM1NjU2M10sIFstNzMuMjgzNDI0LCA0Mi4zNTY2NzJdLCBbLTczLjI4MzE2NiwgNDIuMzU3MjExXSwgWy03My4yODI5NTQxLCA0Mi4zNTc2NTU5XSwgWy03My4yODIwOTQxLCA0Mi4zNTc1MDY5XSwgWy03My4yODE5NzQsIDQyLjM1NzQ5NV0sIFstNzMuMjgxODU2NSwgNDIuMzU3NDk0Ml0sIFstNzMuMjgxMzQ2LCA0Mi4zNTc1MTY1XSwgWy03My4yODExNzk2LCA0Mi4zNTc1MDkxXSwgWy03My4yODExODEsIDQyLjM1NzExN10sIFstNzMuMjgxMTg2LCA0Mi4zNTY5MTNdLCBbLTczLjI4MTE5OSwgNDIuMzU2ODZdLCBbLTczLjI4MTIyMiwgNDIuMzU2Nzk4XSwgWy03My4yODEzNzQsIDQyLjM1NjU5NV0sIFstNzMuMjgxNTQzLCA0Mi4zNTYzNjldLCBbLTczLjI4MTU1NSwgNDIuMzU2MzU2XSwgWy03My4yODE1NjUsIDQyLjM1NjMzMV0sIFstNzMuMjgxNTcxLCA0Mi4zNTYzMDZdLCBbLTczLjI4MTU3NywgNDIuMzU2MjddLCBbLTczLjI4MTU3OCwgNDIuMzU2MjE4XSwgWy03My4yODE1NzMsIDQyLjM1NjE1N10sIFstNzMuMjgxNTU1LCA0Mi4zNTYxMDNdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwMjAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiQmFza2V0YmFsbCBDb3VydCIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiAyLCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDc4OS42NTYsICJsZW5ndGhfbWkiOiAwLjQ5MDY2OTQ5MDE3NzM2NDE2LCAib3JpZ2luX2lkIjogIktlbWJsZSBJbm4iLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4MjA4OTcsIDQyLjM1NDExNTFdLCBbLTczLjI4MjE4MjgsIDQyLjM1NDQwNzRdLCBbLTczLjI4MjE4NzMsIDQyLjM1NDQyMTVdLCBbLTczLjI4MjM5NzgsIDQyLjM1NTA3NzhdLCBbLTczLjI4MjI3MjIsIDQyLjM1NTEyNjldLCBbLTczLjI4MjM1MSwgNDIuMzU1MzY3XSwgWy03My4yODMwNTEsIDQyLjM1NTc3N10sIFstNzMuMjgzNzk0LCA0Mi4zNTYyMV0sIFstNzMuMjgzNjksIDQyLjM1NjI1NV0sIFstNzMuMjgzNjI1LCA0Mi4zNTYzMzldLCBbLTczLjI4MzQ4MiwgNDIuMzU2NTYzXSwgWy03My4yODM0MjQsIDQyLjM1NjY3Ml0sIFstNzMuMjgzMTY2LCA0Mi4zNTcyMTFdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MjA5NDEsIDQyLjM1NzUwNjldLCBbLTczLjI4MTk3NCwgNDIuMzU3NDk1XSwgWy03My4yODE4NTY1LCA0Mi4zNTc0OTQyXSwgWy03My4yODEzNDYsIDQyLjM1NzUxNjVdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MDkyOTYsIDQyLjM1NzUyNF0sIFstNzMuMjgwODQyMywgNDIuMzU3NTQ0NF0sIFstNzMuMjgwNzcyMSwgNDIuMzU3NTc0M11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA0MDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJPcmViZWQgUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA0LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDY2MC4yNDQsICJsZW5ndGhfbWkiOiAwLjQxMDI1NjYwMTQ0NzU0NjMzLCAib3JpZ2luX2lkIjogIktlbWJsZSBJbm4iLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4MjA4OTcsIDQyLjM1NDExNTFdLCBbLTczLjI4MjE4MjgsIDQyLjM1NDQwNzRdLCBbLTczLjI4MjE4NzMsIDQyLjM1NDQyMTVdLCBbLTczLjI4MjM5NzgsIDQyLjM1NTA3NzhdLCBbLTczLjI4MjI3MjIsIDQyLjM1NTEyNjldLCBbLTczLjI4MjM1MSwgNDIuMzU1MzY3XSwgWy03My4yODMwNTEsIDQyLjM1NTc3N10sIFstNzMuMjgzNzk0LCA0Mi4zNTYyMV0sIFstNzMuMjgzNjksIDQyLjM1NjI1NV0sIFstNzMuMjgzNjI1LCA0Mi4zNTYzMzldLCBbLTczLjI4MzQ4MiwgNDIuMzU2NTYzXSwgWy03My4yODM0MjQsIDQyLjM1NjY3Ml0sIFstNzMuMjgzMTY2LCA0Mi4zNTcyMTFdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MjA5NDEsIDQyLjM1NzUwNjldLCBbLTczLjI4MTk3NCwgNDIuMzU3NDk1XSwgWy03My4yODE4NTY1LCA0Mi4zNTc0OTQyXSwgWy03My4yODEzNDYsIDQyLjM1NzUxNjVdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MDkyOTYsIDQyLjM1NzUyNF0sIFstNzMuMjgwODQyMywgNDIuMzU3NTQ0NF0sIFstNzMuMjgwNzcyMSwgNDIuMzU3NTc0M10sIFstNzMuMjgwNjUyNiwgNDIuMzU3NTk5OF0sIFstNzMuMjgwNjM2LCA0Mi4zNTc3MjddLCBbLTczLjI4MDYyMSwgNDIuMzU3ODgxXSwgWy03My4yODA2MjUsIDQyLjM1ODA0NV0sIFstNzMuMjgwNjUzLCA0Mi4zNTgyMDhdLCBbLTczLjI4MDY5MywgNDIuMzU4MzQxXSwgWy03My4yODA3NjUsIDQyLjM1ODQ2OV0sIFstNzMuMjgwNzcyLCA0Mi4zNTg0ODNdLCBbLTczLjI4MDg0NywgNDIuMzU4NjIxXV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDQwMDIsICJkZXN0aW5hdGlvbl9uYW1lIjogIk9yZWJlZCBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDQsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNzg3LjExMTAwMDAwMDAwMDEsICJsZW5ndGhfbWkiOiAwLjQ4OTA4ODEwMDQ5MzEyMDI0LCAib3JpZ2luX2lkIjogIktlbWJsZSBJbm4iLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4MjA4OTcsIDQyLjM1NDExNTFdLCBbLTczLjI4MjE4MjgsIDQyLjM1NDQwNzRdLCBbLTczLjI4MjE4NzMsIDQyLjM1NDQyMTVdLCBbLTczLjI4MjM5NzgsIDQyLjM1NTA3NzhdLCBbLTczLjI4MjI3MjIsIDQyLjM1NTEyNjldLCBbLTczLjI4MjM1MSwgNDIuMzU1MzY3XSwgWy03My4yODMwNTEsIDQyLjM1NTc3N10sIFstNzMuMjgzNzk0LCA0Mi4zNTYyMV0sIFstNzMuMjgzNjksIDQyLjM1NjI1NV0sIFstNzMuMjgzNjI1LCA0Mi4zNTYzMzldLCBbLTczLjI4MzQ4MiwgNDIuMzU2NTYzXSwgWy03My4yODM0MjQsIDQyLjM1NjY3Ml0sIFstNzMuMjgzMTY2LCA0Mi4zNTcyMTFdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MjA5NDEsIDQyLjM1NzUwNjldLCBbLTczLjI4MTk3NCwgNDIuMzU3NDk1XSwgWy03My4yODE4NTY1LCA0Mi4zNTc0OTQyXSwgWy03My4yODEzNDYsIDQyLjM1NzUxNjVdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MTE4MSwgNDIuMzU3MTE3XSwgWy03My4yODExODYsIDQyLjM1NjkxM10sIFstNzMuMjgxMTk5LCA0Mi4zNTY4Nl0sIFstNzMuMjgxMjIyLCA0Mi4zNTY3OThdLCBbLTczLjI4MTM3NCwgNDIuMzU2NTk1XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDUwMDEsICJkZXN0aW5hdGlvbl9uYW1lIjogIlRlbm5pcyBDb3VydHMiLCAiZGVzdGluYXRpb25fcGFya2lkIjogNSwgImhpZ2hsaWdodCI6IHt9LCAibGVuZ3RoX20iOiA3MzAuNjc3LCAibGVuZ3RoX21pIjogMC40NTQwMjE2Mzg2MzAzOTg0NiwgIm9yaWdpbl9pZCI6ICJLZW1ibGUgSW5uIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODIwODk3LCA0Mi4zNTQxMTUxXSwgWy03My4yODIxODI4LCA0Mi4zNTQ0MDc0XSwgWy03My4yODIxODczLCA0Mi4zNTQ0MjE1XSwgWy03My4yODIzOTc4LCA0Mi4zNTUwNzc4XSwgWy03My4yODIyNzIyLCA0Mi4zNTUxMjY5XSwgWy03My4yODIzNTEsIDQyLjM1NTM2N10sIFstNzMuMjgzMDUxLCA0Mi4zNTU3NzddLCBbLTczLjI4Mzc5NCwgNDIuMzU2MjFdLCBbLTczLjI4MzY5LCA0Mi4zNTYyNTVdLCBbLTczLjI4MzYyNSwgNDIuMzU2MzM5XSwgWy03My4yODM0ODIsIDQyLjM1NjU2M10sIFstNzMuMjgzNDI0LCA0Mi4zNTY2NzJdLCBbLTczLjI4MzE2NiwgNDIuMzU3MjExXSwgWy03My4yODI5NTQxLCA0Mi4zNTc2NTU5XSwgWy03My4yODIwOTQxLCA0Mi4zNTc1MDY5XSwgWy03My4yODE5NzQsIDQyLjM1NzQ5NV0sIFstNzMuMjgxODU2NSwgNDIuMzU3NDk0Ml0sIFstNzMuMjgxMzQ2LCA0Mi4zNTc1MTY1XSwgWy03My4yODExNzk2LCA0Mi4zNTc1MDkxXSwgWy03My4yODExODEsIDQyLjM1NzExN10sIFstNzMuMjgxMTg2LCA0Mi4zNTY5MTNdLCBbLTczLjI4MTE5OSwgNDIuMzU2ODZdLCBbLTczLjI4MTIyMiwgNDIuMzU2Nzk4XSwgWy03My4yODEzNzQsIDQyLjM1NjU5NV0sIFstNzMuMjgxNTQzLCA0Mi4zNTYzNjldLCBbLTczLjI4MTU1NSwgNDIuMzU2MzU2XSwgWy03My4yODE1NjUsIDQyLjM1NjMzMV0sIFstNzMuMjgxNTcxLCA0Mi4zNTYzMDZdLCBbLTczLjI4MTU3NywgNDIuMzU2MjddLCBbLTczLjI4MTU3OCwgNDIuMzU2MjE4XSwgWy03My4yODE1NzMsIDQyLjM1NjE1N10sIFstNzMuMjgxNTU1LCA0Mi4zNTYxMDNdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNTAwMiwgImRlc3RpbmF0aW9uX25hbWUiOiAiVGVubmlzIENvdXJ0cyIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA1LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDc4OS42NTYsICJsZW5ndGhfbWkiOiAwLjQ5MDY2OTQ5MDE3NzM2NDE2LCAib3JpZ2luX2lkIjogIktlbWJsZSBJbm4iLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4MjA4OTcsIDQyLjM1NDExNTFdLCBbLTczLjI4MjE4MjgsIDQyLjM1NDQwNzRdLCBbLTczLjI4MjE4NzMsIDQyLjM1NDQyMTVdLCBbLTczLjI4MjM5NzgsIDQyLjM1NTA3NzhdLCBbLTczLjI4MjI3MjIsIDQyLjM1NTEyNjldLCBbLTczLjI4MjM1MSwgNDIuMzU1MzY3XSwgWy03My4yODMwNTEsIDQyLjM1NTc3N10sIFstNzMuMjgzNzk0LCA0Mi4zNTYyMV0sIFstNzMuMjg0NzE4LCA0Mi4zNTY3NTFdLCBbLTczLjI4NDgwOTMsIDQyLjM1NjgxNDVdLCBbLTczLjI4NDg4NSwgNDIuMzU2ODc3Ml0sIFstNzMuMjg0OTY4NiwgNDIuMzU2OTc5NV0sIFstNzMuMjg0OTk5MiwgNDIuMzU3MDc2N10sIFstNzMuMjg0OTk4OCwgNDIuMzU3MTU4OV0sIFstNzMuMjg0OTgwNCwgNDIuMzU3MjM5M10sIFstNzMuMjg0OTQyLCA0Mi4zNTczMDldLCBbLTczLjI4NDU4NTcsIDQyLjM1ODA2MTNdLCBbLTczLjI4NDU2NTcsIDQyLjM1ODExMThdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNzAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiTGlsYWMgUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA3LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDU2Mi4yNDksICJsZW5ndGhfbWkiOiAwLjM0OTM2NTMzMTQ2NDI0ODgsICJvcmlnaW5faWQiOiAiS2VtYmxlIElubiIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjgyMDg5NywgNDIuMzU0MTE1MV0sIFstNzMuMjgyMTgyOCwgNDIuMzU0NDA3NF0sIFstNzMuMjgyMTg3MywgNDIuMzU0NDIxNV0sIFstNzMuMjgyMzk3OCwgNDIuMzU1MDc3OF0sIFstNzMuMjgyMjcyMiwgNDIuMzU1MTI2OV0sIFstNzMuMjgyMzUxLCA0Mi4zNTUzNjddLCBbLTczLjI4MzA1MSwgNDIuMzU1Nzc3XSwgWy03My4yODM3OTQsIDQyLjM1NjIxXSwgWy03My4yODQ3MTgsIDQyLjM1Njc1MV0sIFstNzMuMjg0ODA5MywgNDIuMzU2ODE0NV0sIFstNzMuMjg0ODg1LCA0Mi4zNTY4NzcyXSwgWy03My4yODQ5Njg2LCA0Mi4zNTY5Nzk1XSwgWy03My4yODQ5OTkyLCA0Mi4zNTcwNzY3XSwgWy03My4yODQ5OTg4LCA0Mi4zNTcxNTg5XSwgWy03My4yODQ5ODA0LCA0Mi4zNTcyMzkzXSwgWy03My4yODQ5NDIsIDQyLjM1NzMwOV0sIFstNzMuMjg0NTg1NywgNDIuMzU4MDYxM10sIFstNzMuMjg0NTY1NywgNDIuMzU4MTExOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA3MDAyLCAiZGVzdGluYXRpb25fbmFtZSI6ICJMaWxhYyBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDcsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNTYyLjI0OSwgImxlbmd0aF9taSI6IDAuMzQ5MzY1MzMxNDY0MjQ4OCwgIm9yaWdpbl9pZCI6ICJLZW1ibGUgSW5uIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODg2NjMsIDQyLjM1Njg5OV0sIFstNzMuMjg4MjMzLCA0Mi4zNTY4NjRdLCBbLTczLjI4Nzg4NiwgNDIuMzU2ODVdLCBbLTczLjI4NzAzNjQsIDQyLjM1NjgzNjJdLCBbLTczLjI4NTIxNiwgNDIuMzU2NzY2XSwgWy03My4yODQ3MTgsIDQyLjM1Njc1MV0sIFstNzMuMjgzNzk0LCA0Mi4zNTYyMV0sIFstNzMuMjgzMDUxLCA0Mi4zNTU3NzddLCBbLTczLjI4MjM1MSwgNDIuMzU1MzY3XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDEwMDEsICJkZXN0aW5hdGlvbl9uYW1lIjogIkNvbW11bml0eSBDZW50ZXIiLCAiZGVzdGluYXRpb25fcGFya2lkIjogMSwgImhpZ2hsaWdodCI6IHt9LCAibGVuZ3RoX20iOiA1NzIuNjg0LCAibGVuZ3RoX21pIjogMC4zNTU4NDkzMzk4NTUyNDUzNiwgIm9yaWdpbl9pZCI6ICJUYW5nbGV3b29kIEluc3RpdHV0ZSIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjg4NjYzLCA0Mi4zNTY4OTldLCBbLTczLjI4ODIzMywgNDIuMzU2ODY0XSwgWy03My4yODc4ODYsIDQyLjM1Njg1XSwgWy03My4yODcwMzY0LCA0Mi4zNTY4MzYyXSwgWy03My4yODUyMTYsIDQyLjM1Njc2Nl0sIFstNzMuMjg0OTgwNCwgNDIuMzU3MjM5M10sIFstNzMuMjg0OTQyLCA0Mi4zNTczMDldLCBbLTczLjI4NDU4NTcsIDQyLjM1ODA2MTNdLCBbLTczLjI4NDQwODIsIDQyLjM1ODAxNzJdLCBbLTczLjI4Mjk1NDEsIDQyLjM1NzY1NTldLCBbLTczLjI4MjA5NDEsIDQyLjM1NzUwNjldLCBbLTczLjI4MTk3NCwgNDIuMzU3NDk1XSwgWy03My4yODE4NTY1LCA0Mi4zNTc0OTQyXSwgWy03My4yODEzNDYsIDQyLjM1NzUxNjVdLCBbLTczLjI4MTE3OTYsIDQyLjM1NzUwOTFdLCBbLTczLjI4MDkyOTYsIDQyLjM1NzUyNF0sIFstNzMuMjgwODQyMywgNDIuMzU3NTQ0NF0sIFstNzMuMjgwNzcyMSwgNDIuMzU3NTc0M11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA0MDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJPcmViZWQgUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA0LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDc2MC45MjYsICJsZW5ndGhfbWkiOiAwLjQ3MjgxNzQ5NTgyNDM4NTYsICJvcmlnaW5faWQiOiAiVGFuZ2xld29vZCBJbnN0aXR1dGUiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI4ODY2MywgNDIuMzU2ODk5XSwgWy03My4yODgyMzMsIDQyLjM1Njg2NF0sIFstNzMuMjg3ODg2LCA0Mi4zNTY4NV0sIFstNzMuMjg3MDM2NCwgNDIuMzU2ODM2Ml0sIFstNzMuMjg1MjE2LCA0Mi4zNTY3NjZdLCBbLTczLjI4NDk4MDQsIDQyLjM1NzIzOTNdLCBbLTczLjI4NDk0MiwgNDIuMzU3MzA5XSwgWy03My4yODQ1ODU3LCA0Mi4zNTgwNjEzXSwgWy03My4yODQ1NjU3LCA0Mi4zNTgxMTE4XV0sICJ0eXBlIjogIkxpbmVTdHJpbmcifSwgImlkIjogIjAiLCAicHJvcGVydGllcyI6IHsiZGVzdGluYXRpb25fYXBfaWQiOiAxMDcwMDEsICJkZXN0aW5hdGlvbl9uYW1lIjogIkxpbGFjIFBhcmsiLCAiZGVzdGluYXRpb25fcGFya2lkIjogNywgImhpZ2hsaWdodCI6IHt9LCAibGVuZ3RoX20iOiA0NDIuNjM1LCAibGVuZ3RoX21pIjogMC4yNzUwNDA2Mzc2NzU5NzIzLCAib3JpZ2luX2lkIjogIlRhbmdsZXdvb2QgSW5zdGl0dXRlIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yODg2NjMsIDQyLjM1Njg5OV0sIFstNzMuMjg4MjMzLCA0Mi4zNTY4NjRdLCBbLTczLjI4Nzg4NiwgNDIuMzU2ODVdLCBbLTczLjI4NzAzNjQsIDQyLjM1NjgzNjJdLCBbLTczLjI4NTIxNiwgNDIuMzU2NzY2XSwgWy03My4yODQ5ODA0LCA0Mi4zNTcyMzkzXSwgWy03My4yODQ5NDIsIDQyLjM1NzMwOV0sIFstNzMuMjg0NTg1NywgNDIuMzU4MDYxM10sIFstNzMuMjg0NTY1NywgNDIuMzU4MTExOF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA3MDAyLCAiZGVzdGluYXRpb25fbmFtZSI6ICJMaWxhYyBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDcsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNDQyLjYzNSwgImxlbmd0aF9taSI6IDAuMjc1MDQwNjM3Njc1OTcyMywgIm9yaWdpbl9pZCI6ICJUYW5nbGV3b29kIEluc3RpdHV0ZSIsICJzdHlsZSI6IHsiY29sb3IiOiAidHVycXVvaXNlIiwgIm9wYWNpdHkiOiAwLjI1LCAid2VpZ2h0IjogMX19LCAidHlwZSI6ICJGZWF0dXJlIn0sIHsiZ2VvbWV0cnkiOiB7ImNvb3JkaW5hdGVzIjogW1stNzMuMjQ2NDYxLCA0Mi4zMzMxMzFdLCBbLTczLjI0NjU3NywgNDIuMzMzMDQ3XSwgWy03My4yNDY3MjcsIDQyLjMzMzAyNV0sIFstNzMuMjQ2OTMzLCA0Mi4zMzMwMTldLCBbLTczLjI0NzE0OSwgNDIuMzMzMDYyXSwgWy03My4yNDcxOTEsIDQyLjMzMzA3MV0sIFstNzMuMjQ3MzQ4LCA0Mi4zMzMxNDVdLCBbLTczLjI0NzU5NCwgNDIuMzMzMjcxXSwgWy03My4yNDc5NDYsIDQyLjMzMzU0NF1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA2MDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJUaWxsb3Rzb24gUGFyayIsICJkZXN0aW5hdGlvbl9wYXJraWQiOiA2LCAiaGlnaGxpZ2h0Ijoge30sICJsZW5ndGhfbSI6IDE0Ni42OSwgImxlbmd0aF9taSI6IDAuMDkxMTQ4OTQwMTg5Mjk0NTIsICJvcmlnaW5faWQiOiAiVGFubmVycyBNYXJrZXQiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI3MjY2NTYsIDQyLjM1NTU1OTldLCBbLTczLjI3Mjc3MzksIDQyLjM1NTU1MzRdLCBbLTczLjI3MzM2NSwgNDIuMzU1NTE1XSwgWy03My4yNzM3OTcsIDQyLjM1NTQ5Ml0sIFstNzMuMjc0MzU4LCA0Mi4zNTU0NTddLCBbLTczLjI3NDkwNywgNDIuMzU1NDE2XSwgWy03My4yNzU2MDYsIDQyLjM1NTM3OF0sIFstNzMuMjc2MTE4LCA0Mi4zNTUzNDJdLCBbLTczLjI3NjI1NywgNDIuMzU1MzM2XSwgWy03My4yNzY2MDgsIDQyLjM1NTMxOV0sIFstNzMuMjc3MDEsIDQyLjM1NTNdLCBbLTczLjI3NzE2MiwgNDIuMzU1MjkxXSwgWy03My4yNzcyNjgsIDQyLjM1NTI5N10sIFstNzMuMjc3NDI5LCA0Mi4zNTUzXSwgWy03My4yNzc2NDEsIDQyLjM1NTMzM10sIFstNzMuMjc3ODM3LCA0Mi4zNTUzODNdLCBbLTczLjI3ODA1NCwgNDIuMzU1NDcxXSwgWy03My4yNzgzMywgNDIuMzU1NjMyXSwgWy03My4yNzg4NjEsIDQyLjM1NjAwN10sIFstNzMuMjc5MDE0LCA0Mi4zNTYxMTddLCBbLTczLjI3OTI1OSwgNDIuMzU2MjkyXSwgWy03My4yNzkyNzksIDQyLjM1NjMwN10sIFstNzMuMjc5NzExLCA0Mi4zNTY2MjFdLCBbLTczLjI3OTg1LCA0Mi4zNTY3MjJdLCBbLTczLjI3OTg3NSwgNDIuMzU2NzQxXSwgWy03My4yODA1OSwgNDIuMzU3Mjc1MV0sIFstNzMuMjgwNjc5NywgNDIuMzU3MzM3NV0sIFstNzMuMjgwNjU1LCA0Mi4zNTc1MzNdLCBbLTczLjI4MDY1MjYsIDQyLjM1NzU5OThdLCBbLTczLjI4MDc3MjEsIDQyLjM1NzU3NDNdXSwgInR5cGUiOiAiTGluZVN0cmluZyJ9LCAiaWQiOiAiMCIsICJwcm9wZXJ0aWVzIjogeyJkZXN0aW5hdGlvbl9hcF9pZCI6IDEwNDAwMSwgImRlc3RpbmF0aW9uX25hbWUiOiAiT3JlYmVkIFBhcmsiLCAiZGVzdGluYXRpb25fcGFya2lkIjogNCwgImhpZ2hsaWdodCI6IHt9LCAibGVuZ3RoX20iOiA3ODYuODksICJsZW5ndGhfbWkiOiAwLjQ4ODk1MDc3NzQ1OTYzNTcsICJvcmlnaW5faWQiOiAiQmVya3NoaXJlIEdyYWluIiwgInN0eWxlIjogeyJjb2xvciI6ICJ0dXJxdW9pc2UiLCAib3BhY2l0eSI6IDAuMjUsICJ3ZWlnaHQiOiAxfX0sICJ0eXBlIjogIkZlYXR1cmUifSwgeyJnZW9tZXRyeSI6IHsiY29vcmRpbmF0ZXMiOiBbWy03My4yNzI2NjU2LCA0Mi4zNTU1NTk5XSwgWy03My4yNzI3NzM5LCA0Mi4zNTU1NTM0XSwgWy03My4yNzMzNjUsIDQyLjM1NTUxNV0sIFstNzMuMjczNzk3LCA0Mi4zNTU0OTJdLCBbLTczLjI3NDM1OCwgNDIuMzU1NDU3XSwgWy03My4yNzQ5MDcsIDQyLjM1NTQxNl0sIFstNzMuMjc1NjA2LCA0Mi4zNTUzNzhdLCBbLTczLjI3NTYxNywgNDIuMzU1NTYzXSwgWy03My4yNzU2NDYsIDQyLjM1NTc5OF0sIFstNzMuMjc1NjksIDQyLjM1NjI0M10sIFstNzMuMjc1NzI2LCA0Mi4zNTY1OTldLCBbLTczLjI3NTc0LCA0Mi4zNTY2ODJdLCBbLTczLjI3NTc0NCwgNDIuMzU2NzA5XSwgWy03My4yNzU3OTMsIDQyLjM1Njc3Nl1dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTA4MDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJWZXRlcmFucyBNZW1vcmlhbCBQYXJrIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDgsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogMzk5LjQwMTk5OTk5OTk5OTkzLCAibGVuZ3RoX21pIjogMC4yNDgxNzY4OTY5MjE5NzU2MSwgIm9yaWdpbl9pZCI6ICJCZXJrc2hpcmUgR3JhaW4iLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9LCB7Imdlb21ldHJ5IjogeyJjb29yZGluYXRlcyI6IFtbLTczLjI3ODE1NSwgNDIuMzUzNl0sIFstNzMuMjc4NTY2LCA0Mi4zNTM4NTddLCBbLTczLjI3OTAxOSwgNDIuMzU0MTE5XSwgWy03My4yNzk1OTYsIDQyLjM1NDQ5NV0sIFstNzMuMjgwMTAzOSwgNDIuMzU0MDY4XSwgWy03My4yODA4OSwgNDIuMzU0NTI0XSwgWy03My4yODE1NjA4LCA0Mi4zNTQ5MTExXSwgWy03My4yODIzNTEsIDQyLjM1NTM2N11dLCAidHlwZSI6ICJMaW5lU3RyaW5nIn0sICJpZCI6ICIwIiwgInByb3BlcnRpZXMiOiB7ImRlc3RpbmF0aW9uX2FwX2lkIjogMTAxMDAxLCAiZGVzdGluYXRpb25fbmFtZSI6ICJDb21tdW5pdHkgQ2VudGVyIiwgImRlc3RpbmF0aW9uX3BhcmtpZCI6IDEsICJoaWdobGlnaHQiOiB7fSwgImxlbmd0aF9tIjogNDUyLjM3MiwgImxlbmd0aF9taSI6IDAuMjgxMDkwOTI4OTc0Nzg3MjcsICJvcmlnaW5faWQiOiAiVGhlIEVnbW9udHMiLCAic3R5bGUiOiB7ImNvbG9yIjogInR1cnF1b2lzZSIsICJvcGFjaXR5IjogMC4yNSwgIndlaWdodCI6IDF9fSwgInR5cGUiOiAiRmVhdHVyZSJ9XSwgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24ifQogICAgICAgICAgICAKICAgICAgICAgICAgKS5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgIGdlb19qc29uXzEyMTQ4NDQ5N2Q5ODQ3NzU5MmIzNzI4MzM1MzdlOTgzLnNldFN0eWxlKGZ1bmN0aW9uKGZlYXR1cmUpIHtyZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLnN0eWxlO30pOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlY2YyNzUwNGE2NzQ3ZjVhMTMyOWQzMWYxNjliMjRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzU4NDUwODQxODkxMywgLTczLjI4NTU5MjAzODQ0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ3aGl0ZXNtb2tlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAxLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDIKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2OTg3NGYwZjU1MDQ1YzdhNGNjNmZmMzA3NGRjOGFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzU5NDQ1MTY2NDgxLCAtNzMuMjgyMjY1MzIwNzIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ3aGl0ZXNtb2tlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAxLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDIKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U2ZGVhMTUwMmEzMjQxODJiNGNmNzdmOGMwNWZmNTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzU0MjI0LCAtNzMuMjgyMDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIndoaXRlc21va2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDEsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMSwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMgp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmQ4YTU4MGUzMDE0NDA3ZGIzOTY1ZTg4YzdhODRhMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4zNTY4MDkzNjA3MzM1LCAtNzMuMjg4NTk2Nzc1NTMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ3aGl0ZXNtb2tlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAxLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDIKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkY2VhMTE5ZjIyMzRhMzc4OGNjZTZiYWVlYTdkMjNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzMzMTA2LCAtNzMuMjQ2MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIndoaXRlc21va2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDEsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMSwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMgp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk3NjMwZmE5YzQyNDMzOGE4ZTNmNTkxNjJhNTk2MTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4zNTU0ODMsIC03My4yNzI1NzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAid2hpdGVzbW9rZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMSwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAyCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZTMyM2JkYzAwOGU0NDliOTA5OWM1NzU2OTVmM2Q5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjM1MzI1MjQ1NzI4LCAtNzMuMjc4NTIzOTg4MzE5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ3aGl0ZXNtb2tlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAxLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDIKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5NTJkMmEyNGEzZjRhN2RhYzg4OTA3ODA4ODI0OWYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzU1NDI2MTU0NjczMDYsIC03My4yODIzMTk2MDUzNTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hODU4YjIxMTI4MmY0YThmOWM0ZWZhYmJjZDFlZDFkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjM1NjA2ODM1MTE0NjA1LCAtNzMuMjgxNjY1MTQ2MzUwODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiYmxhY2siLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDEKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhOTU4ZjViMTc2ODRhNzFiZDk5YmU4ZjJiMjI4NDY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzI3Mjg1OTU4Mzg2OTQsIC03My4yNjI3MTUzMzk2NjA2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJibGFjayIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMQp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTUxZDg4YjhkOGFhNGEzOWFjMTAyZjQ1Njk1MmEzN2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4zNTc2MzIxOTEwMzQxOCwgLTczLjI4MDczOTc4NDI0MDcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZWYwNTYxOWQ1MWI0NzZjYjAyNDJlOTFjMGM3ODg2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjM1ODU1MzgyNzQ5NDY0NiwgLTczLjI4MDkwODc2MzQwODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNTZjMzg4ZWVlMjM0MzI2YjVjYzlkZWIwZTJkZjAzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjM1NjUzODEwMTgxNzYwNSwgLTczLjI4MTM4ODg3ODgyMjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NjUwYWYzNmM3OTY0NWMzOTBmZDU4OGQwY2UwM2Y5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjM1NjEzNjczMjc5MTMsIC03My4yODE0OTQ4MjYwNzg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYzkyMzM5NWNjOTA0NDIyODIwMjU3NmQ3MGIxOWVhNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjMzMzUxNDIwNjg0Mzk1LCAtNzMuMjQ3ODE1NjY4NTgyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJibGFjayIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMQp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2JmNmRkMTIwMjkxNGVkOTk2M2UzN2RiNTI4OTJiOWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4zNTgzMTIwMjMxMDc2MiwgLTczLjI4NTA4NDk2Mjg0NDg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMGJiYTA2NTlkOGE0YmJkYWNmNjdlNzE1ZTJkZWM3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjM1ODUzNzk3MTQ5Nzc4LCAtNzMuMjg0NTc4MDI1MzQxMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmxhY2siLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiYmxhY2siLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDEKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8wYzJlZDFlY2Q3ZjM0NGYyODIzMjkxMzQ1NzQyZjQyNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViNzczODc5NDFiYzQ2ZjdhYmVkOGQ1Yzc5ODI0NzEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzI3OTc0MDUwNTIwODY1LCAtNzMuMjYzMTkyNzcyODY1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibGFjayIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJibGFjayIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMQp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzBjMmVkMWVjZDdmMzQ0ZjI4MjMyOTEzNDU3NDJmNDI1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVlZGMzMjZlMWNhNDQwNGEwNWY0NDhlYmMxN2U2MGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4zNTY3Nzc5MzA5NzUyNiwgLTczLjI3NTcyMTM3MTE3Mzg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsYWNrIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImJsYWNrIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAxCn0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMGMyZWQxZWNkN2YzNDRmMjgyMzI5MTM0NTc0MmY0MjUpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x265e58b54e0>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"geolocator = Nominatim(user_agent='prcr-ncc')\n",
"center = geolocator.geocode('Lenox, MA, USA')\n",
"\n",
"m = folium.Map(\n",
" location = [center.latitude, center.longitude],\n",
" tiles = 'https://cartodb-basemaps-a.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png',\n",
" attr = '&copy; <a href=\"http://www.openstreetmap.org/copyright\">OpenStreetMap</a> &copy; <a href=\"http://cartodb.com/attributions\">CartoDB</a>',\n",
" zoom_start = 16\n",
")\n",
"\n",
"# PARKS LAYER\n",
"parks_gdf = gpd.read_file('lenox_parks.geojson')\n",
"parks_json = gdf_to_geojson(parks_gdf)\n",
"\n",
"park_style = lambda feature : {\n",
" 'color': 'green',\n",
" 'weight': 0,\n",
" 'fillOpacity': 0.8\n",
"}\n",
"\n",
"parks = folium.features.GeoJson(parks_json, style_function = park_style)\n",
"m.add_child(parks)\n",
"\n",
"# SHORTEST ROUTES LAYER\n",
"shortest_routes_json = gdf_to_geojson(shortest_routes_gdf) \n",
"\n",
"shortest_routes_style = lambda feature : {\n",
" 'color': 'turquoise',\n",
" 'opacity': 0.25,\n",
" 'weight': 1\n",
"}\n",
"shortest_routes = folium.features.GeoJson(shortest_routes_json, style_function = shortest_routes_style)\n",
"m.add_child(shortest_routes)\n",
"\n",
"# ORIGINS LAYER\n",
"origin_json = gdf_to_geojson(start_gdf)\n",
"for origin in origin_json['features']:\n",
" origin_coordinates = origin['geometry']['coordinates']\n",
" origin_coordinates = [coord for coord in reversed(origin_coordinates)]\n",
" origin_point = folium.CircleMarker(location = origin_coordinates,\n",
" radius = 5,\n",
" fill_color = 'orange',\n",
" fill_opacity = 1,\n",
" color = 'whitesmoke',\n",
" weight = 2,\n",
" opacity = 1\n",
" )\n",
" m.add_child(origin_point)\n",
"\n",
"# DESTINATIONS LAYER\n",
"destination_json = gdf_to_geojson(pap_gdf)\n",
"for destination in destination_json['features']:\n",
" destination_coordinates = [coord for coord in reversed(destination['geometry']['coordinates'])]\n",
" destination_point = folium.CircleMarker(location = destination_coordinates,\n",
" radius = 3,\n",
" color = 'black',\n",
" weight = 1\n",
" )\n",
" m.add_child(destination_point)\n",
"\n",
"# SHOW MAP\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Export generated data\n",
"\n",
"Maybe we want to check out this data in QGIS or something. We can export the GeoJSON here. Not totally necessary though."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open('origins.geojson', 'w') as outfile:\n",
" json.dump(origin_json, outfile, ensure_ascii = False)\n",
"\n",
"with open('shortest_routes.geojson', 'w') as outfile:\n",
" json.dump(shortest_routes_json, outfile, ensure_ascii = False)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment