{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PoC of Recommender System for safe and efficient Food Deliveries during Infectious Disease induced Lockdowns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Course \"IBM Data Science\", Capstone Project, April 2020 by [Markus Mächler](https://www.linkedin.com/in/markus-maechler/)\n", "\n", "_written and tested with Jupyter Notebook 6.0.3 (with Python 3.7.6 on Win10x64 and MacOS 10.15.4)_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Folium maps are not rendered on github. For the best experience, [please view this notebook with this link](https://nbviewer.jupyter.org/github/Funisher-code/Coursera_Capstone/blob/master/notebook/POC_food_delivery_recommender_system.ipynb).**\n", "\n", "----" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Major problems during a lockdown concerning shopping / food deliveries\n", "1. keep people at risk **safe but not hungry**\n", "2. keep shops and restaurants **up and running**\n", "3. use helpers as **efficiently and safely** as possible" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The purpose of this project is creating a small POC (proof of concept) to help tackling our three problems by creating a simple but efficient recommender system that could be used to place actual orders." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**For more background information, [read the full report here](https://github.com/Funisher-code/Coursera_Capstone/blob/master/report/COVID-19_Safe_And_Efficient_Food_Deliveries.md).**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data + Methodology" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Location Data\n", "\n", "For every order, **location data of all the three parties** is absolutely necessary. For this POC I'm using the following data sources.\n", "\n", "- customers: **hypothetical address of a customer in Zurich**\n", "- helpers: **hypothetical addresses in Zurich**\n", "- shops: **Foursquare location data** acquired via API in the vicinity of people at risk\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### install dependencies if not already installed" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# map rendering library\n", "\n", "#!conda install -c conda-forge folium=0.5.0 --yes # uncomment if not installed already" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# used to locate the coordinates of addresses, cities, countries, and landmarks across the globe\n", "# using third-party geocoders and other data sources\n", "\n", "#!conda install -c conda-forge geopy --yes # uncomment if not installed already" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# install python library to generate fake data\n", "\n", "#!conda install -c conda-forge faker --yes # uncomment if not installed already" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### import necessary libraries" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Libraries imported.\n" ] } ], "source": [ "from geopy.geocoders import Nominatim\n", "import geopy.distance\n", "import folium \n", "from collections import namedtuple\n", "import pandas as pd # for working with dataframes\n", "import numpy as np # for workig with matrizes\n", "from scipy import stats # for getting quick descriptive statistics\n", "import matplotlib.pyplot as plt # for plotting\n", "from matplotlib.colors import LinearSegmentedColormap # to define custom colored maps in our plots\n", "import requests # to handle requests\n", "import time # used to sleep for a defined amount of time\n", "from faker import Faker # to generate fake person data\n", "\n", "print('Libraries imported.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### customer location data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's define an address of a customer to work with. This would simply be something a customer would have to specify upon signing up. I just picked one at random." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "custAddr = 'Gsteigstrasse 9, 8049 Zurich'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we define an instance of geocoder with user agent _food_explorer_.\n", "\n", "And we use it to convert our customer address to a location in terms of latitude and longitude." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The geograpical coordinate of Gsteigstrasse 9, 8049 Zurich are 47.4028839, 8.499580847726023.\n" ] } ], "source": [ "geolocator = Nominatim(user_agent=\"food_explorer\")\n", "location = geolocator.geocode(custAddr)\n", "custLatitude = location.latitude\n", "custLongitude = location.longitude\n", "print('The geograpical coordinate of {} are {}, {}.'.format(custAddr, custLatitude, custLongitude))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's quickly check if the coordinates reflect the addess of the customer." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><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+ICNtYXBfZmQwZDM3ZWE3YjYyNGE5MDhhMGRjNzg5ZjU1ZGIxMDIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2ZkMGQzN2VhN2I2MjRhOTA4YTBkYzc4OWY1NWRiMTAyIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9mZDBkMzdlYTdiNjI0YTkwOGEwZGM3ODlmNTVkYjEwMiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9mZDBkMzdlYTdiNjI0YTkwOGEwZGM3ODlmNTVkYjEwMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNDdiNmFlZjZjMDc3NGNhZWFiYzM2YTllYWI5MDUzYzQgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZmQwZDM3ZWE3YjYyNGE5MDhhMGRjNzg5ZjU1ZGIxMDIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3Yjc2YzRiOTNkMzRkZTFhMjI4NGNiMjhmM2VlOTViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2ZkMGQzN2VhN2I2MjRhOTA4YTBkYzc4OWY1NWRiMTAyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5NWRiNTY5MDE4NjQxM2ZhMTM0M2JjMTViYzk0NTRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NjYyMTQ0MTAyNDRiNWJiZTk4NTIwNGJlZWYzMjc1ID0gJCgnPGRpdiBpZD0iaHRtbF80NjY2MjE0NDEwMjQ0YjViYmU5ODUyMDRiZWVmMzI3NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3N0ZWlnc3RyYXNzZSA5LCA4MDQ5IFp1cmljaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTk1ZGI1NjkwMTg2NDEzZmExMzQzYmMxNWJjOTQ1NGIuc2V0Q29udGVudChodG1sXzQ2NjYyMTQ0MTAyNDRiNWJiZTk4NTIwNGJlZWYzMjc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M3Yjc2YzRiOTNkMzRkZTFhMjI4NGNiMjhmM2VlOTViLmJpbmRQb3B1cChwb3B1cF85OTVkYjU2OTAxODY0MTNmYTEzNDNiYzE1YmM5NDU0Yik7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ 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 0x1a24e72f10>" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create map of Zurich using the latitude and longitude value generated by geocoder\n", "map_folium = folium.Map(location=[custLatitude, custLongitude], zoom_start=15)\n", "\n", "# add marker of our address to the map\n", "label = custAddr\n", "label = folium.Popup(label, parse_html=True)\n", "folium.CircleMarker(\n", " [custLatitude, custLongitude],\n", " radius=5,\n", " popup=label,\n", " color='red',\n", " parse_html=False).add_to(map_folium) \n", " \n", "map_folium" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, if you can't see the map above, that's totally normal github behaviour. [Please view this notebook with this link](https://nbviewer.jupyter.org/github/Funisher-code/Coursera_Capstone/blob/master/notebook/POC_food_delivery_recommender_system.ipynb).\n", "\n", "Back to Geolocator. That certainly looks like Zurich but let's zoom all in to make sure it's accurate." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><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+ICNtYXBfYjA0MDg1MGU1ZDIzNDFlOGI5NjdhYmJlOWNhZTNlZmIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2IwNDA4NTBlNWQyMzQxZThiOTY3YWJiZTljYWUzZWZiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9iMDQwODUwZTVkMjM0MWU4Yjk2N2FiYmU5Y2FlM2VmYiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9iMDQwODUwZTVkMjM0MWU4Yjk2N2FiYmU5Y2FlM2VmYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNTlmMTQwNzgzMTJkNDI1ZGE3N2FkYTBjYTVkOTE0ZTcgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjA0MDg1MGU1ZDIzNDFlOGI5NjdhYmJlOWNhZTNlZmIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3ZWRlZjQzYWE2OTQ3YjM5ZTcwYTQyNDA1MjA1MjRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMDQwODUwZTVkMjM0MWU4Yjk2N2FiYmU5Y2FlM2VmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNjQ5YjIzMjBkOTY0OTkxYWI3OTA5ZjhlYjQ4MDEzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjcwZTk1NDIzNmM0Nzg4OTViNjdlYjMzMDIwYjk4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGY3MGU5NTQyMzZjNDc4ODk1YjY3ZWIzMzAyMGI5ODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdzdGVpZ3N0cmFzc2UgOSwgODA0OSBadXJpY2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U2NDliMjMyMGQ5NjQ5OTFhYjc5MDlmOGViNDgwMTMzLnNldENvbnRlbnQoaHRtbF9kZjcwZTk1NDIzNmM0Nzg4OTViNjdlYjMzMDIwYjk4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hN2VkZWY0M2FhNjk0N2IzOWU3MGE0MjQwNTIwNTI0Yi5iaW5kUG9wdXAocG9wdXBfZTY0OWIyMzIwZDk2NDk5MWFiNzkwOWY4ZWI0ODAxMzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== 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 0x1a24eb8650>" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create map of Zurich using the latitude and longitude value generated by geocoder\n", "map_folium = folium.Map(location=[custLatitude, custLongitude], zoom_start=18)\n", "\n", "# add marker of our address to the map\n", "label = custAddr\n", "label = folium.Popup(label, parse_html=True)\n", "folium.CircleMarker(\n", " [custLatitude, custLongitude],\n", " radius=10,\n", " popup=label,\n", " color='red',\n", " parse_html=False).add_to(map_folium) \n", " \n", "map_folium" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nice, that's something we can work with.\n", "\n", "So customers signing up for the delivery service can simply specify their address as location data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<a id = \"tldr1back\"></a>\n", "### helper location data " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like with our customer we will use a Nominatom geolocator to convert our helper addresses to geolocations.\n", "\n", "Unlike with the freshly signed up customer, we will import a list I created with __fictional helper data__ in the vicinity of our customer.\n", "\n", "_TLDR alert, if you don't care how I got this data, leave the next session out [by clicking here to import the resulting csv](#tldr1)._\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", "Or you can take the long way\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", ".\n", "\n", "**Thanks for staying with me. Here's what I did:**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. query https://tel.search.ch/ for the postal code 8049, since that's where our customer lives.\n", "2. copy all search results from the website. that looks something like this:\n", "```\n", "name01, surname01\t\n", "name01, surname01\n", "street01 number01, 8049 Zürich\n", "044 123 45 67\n", "Details\n", "name02, surname02\t\n", "name02, surname02\n", "street02 number02, 8049 Zürich\n", "044 765 43 21 *\n", "Details\n", "```\n", "3. use some powerful editor: get rid of leading and trailing garbage, then convert to a usable csv format. I was on Win10 then and used notepad++ for the following:\n", " - search for \"\\n\" and replace with \";\" since \",\" is already widely used in the addresses\n", " - search for \"\\r\" and \"\\t\" and replace with nothing\n", " - search for \";Details;\" and replace with \"\\n\"\n", "\n", "\n", "4. what we now have resembles something like this:\n", "```\n", "name01, surname01;name01, surname01;street01 number01, 8049 Zürich;044 123 45 67\n", "name02, surname02;name02, surname02;street02 number02, 8049 Zürich;044 765 43 21 *\n", "...\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we import the resulting file to a pandas dataframe. **I tried the following code:**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "helperData=pd.read_csv('helperAddr_raw.csv', sep=';', header=None)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This leads to the following error:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "ParserError: Error tokenizing data. C error: Expected 4 fields in line 51, saw 5\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That didn't work. What happened? After inspection of line 51 I realized that there are cases, where people also specify professions. This results in an additional column.\n", "\n", "**This is just another example why carefully curing your raw data is both important and time consuming.**\n", "\n", "For our purpose I'll just skip rows that don't match the number of columns." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "b'Skipping line 4: expected 4 fields, saw 5\\nSkipping line 5: expected 4 fields, saw 5\\nSkipping line 8: expected 4 fields, saw 5\\nSkipping line 10: expected 4 fields, saw 5\\nSkipping line 11: expected 4 fields, saw 5\\nSkipping line 12: expected 4 fields, saw 5\\nSkipping line 14: expected 4 fields, saw 5\\nSkipping line 16: expected 4 fields, saw 5\\nSkipping line 17: expected 4 fields, saw 5\\nSkipping line 21: expected 4 fields, saw 5\\nSkipping line 23: expected 4 fields, saw 5\\nSkipping line 27: expected 4 fields, saw 5\\nSkipping line 28: expected 4 fields, saw 5\\nSkipping line 33: expected 4 fields, saw 5\\nSkipping line 39: expected 4 fields, saw 5\\nSkipping line 41: expected 4 fields, saw 5\\nSkipping line 42: expected 4 fields, saw 5\\nSkipping line 43: expected 4 fields, saw 5\\nSkipping line 44: expected 4 fields, saw 5\\nSkipping line 46: expected 4 fields, saw 5\\nSkipping line 48: expected 4 fields, saw 5\\nSkipping line 50: expected 4 fields, saw 5\\nSkipping line 53: expected 4 fields, saw 5\\nSkipping line 54: expected 4 fields, saw 5\\nSkipping line 61: expected 4 fields, saw 5\\nSkipping line 64: expected 4 fields, saw 5\\nSkipping line 71: expected 4 fields, saw 5\\nSkipping line 72: expected 4 fields, saw 5\\nSkipping line 73: expected 4 fields, saw 5\\nSkipping line 77: expected 4 fields, saw 5\\nSkipping line 78: expected 4 fields, saw 5\\nSkipping line 79: expected 4 fields, saw 5\\nSkipping line 80: expected 4 fields, saw 5\\nSkipping line 82: expected 4 fields, saw 5\\nSkipping line 84: expected 4 fields, saw 5\\nSkipping line 85: expected 4 fields, saw 5\\nSkipping line 87: expected 4 fields, saw 5\\nSkipping line 90: expected 4 fields, saw 5\\nSkipping line 92: expected 4 fields, saw 5\\nSkipping line 93: expected 4 fields, saw 5\\nSkipping line 94: expected 4 fields, saw 5\\nSkipping line 97: expected 4 fields, saw 5\\nSkipping line 100: expected 4 fields, saw 5\\nSkipping line 102: expected 4 fields, saw 5\\nSkipping line 104: expected 4 fields, saw 5\\nSkipping line 105: expected 4 fields, saw 5\\nSkipping line 106: expected 4 fields, saw 5\\nSkipping line 107: expected 4 fields, saw 5\\nSkipping line 108: expected 4 fields, saw 5\\nSkipping line 109: expected 4 fields, saw 5\\nSkipping line 110: expected 4 fields, saw 5\\nSkipping line 111: expected 4 fields, saw 5\\nSkipping line 113: expected 4 fields, saw 5\\nSkipping line 115: expected 4 fields, saw 5\\nSkipping line 117: expected 4 fields, saw 5\\nSkipping line 122: expected 4 fields, saw 5\\nSkipping line 134: expected 4 fields, saw 5\\nSkipping line 142: expected 4 fields, saw 5\\nSkipping line 151: expected 4 fields, saw 5\\nSkipping line 161: expected 4 fields, saw 5\\nSkipping line 163: expected 4 fields, saw 5\\nSkipping line 164: expected 4 fields, saw 5\\nSkipping line 166: expected 4 fields, saw 5\\nSkipping line 172: expected 4 fields, saw 5\\nSkipping line 175: expected 4 fields, saw 5\\nSkipping line 188: expected 4 fields, saw 5\\nSkipping line 189: expected 4 fields, saw 5\\nSkipping line 192: expected 4 fields, saw 5\\nSkipping line 199: expected 4 fields, saw 5\\nSkipping line 200: expected 4 fields, saw 5\\n'\n" ] } ], "source": [ "helperData=pd.read_csv('helperAddr_raw.csv', sep=';', header=None, error_bad_lines=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's quite some skipped lines. Let's see how many addresses we got:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(130, 4)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So after skipping quite some rows this resulted in 130 unique \"fictional helpers\".\n", "\n", "By the way, the **asterik after the phone number** signifies, that the holder of the number doesn't want to get bothered by ad calls.\n", "\n", "**Allthough this is all puplicly available information, let's get rid of all names and phone numbers.**\n", "\n", "Then we name the remaining column address and have a look at the first 5 rows." ] }, { "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>address</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>Michelstrasse 6, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>Riedhofstrasse 277, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>Brunnwiesenstrasse. 78, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>Rütihofstrasse 32, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>Segantinistrasse 38, 8049 Zürich</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " address\n", "0 Michelstrasse 6, 8049 Zürich\n", "1 Riedhofstrasse 277, 8049 Zürich\n", "2 Brunnwiesenstrasse. 78, 8049 Zürich\n", "3 Rütihofstrasse 32, 8049 Zürich\n", "4 Segantinistrasse 38, 8049 Zürich" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData.drop(columns=[0,1,3], inplace=True)\n", "helperData.rename(columns={2:'address'}, inplace=True)\n", "helperData.head()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "helperData.to_csv('helperData_addresses.csv',sep=';') # save dataframe to a csv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<a id = \"tldr1\"></a>\n", "#### TLDR off\n", "\n", "If you don't want to perform the manual steps up above you may join again from here.\n", "\n", "Or if you accidentally missed the fun part or just made up your mind, you can [click here to go back](#tldr1back).\n", "\n", "If you're not interested in enriching the helper dataframe with geolocation and fake email data, [you can skip that and jump to the next part, where we're visualizing the helper and customer locations on a map.](#tldr1evenfurther).\n", "\n", "\n", "\n", "**Again, thanks for your interest and sticking with me.**\n", "\n", "Let's import the csv containing our addresses." ] }, { "cell_type": "code", "execution_count": 13, "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>address</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>Michelstrasse 6, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>Riedhofstrasse 277, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>Brunnwiesenstrasse. 78, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>Rütihofstrasse 32, 8049 Zürich</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>Segantinistrasse 38, 8049 Zürich</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " address\n", "0 Michelstrasse 6, 8049 Zürich\n", "1 Riedhofstrasse 277, 8049 Zürich\n", "2 Brunnwiesenstrasse. 78, 8049 Zürich\n", "3 Rütihofstrasse 32, 8049 Zürich\n", "4 Segantinistrasse 38, 8049 Zürich" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData=pd.read_csv('helperData_addresses.csv',sep=';') # import csv that resulted from manual data gathering\n", "helperData.drop(columns=['Unnamed: 0'], inplace=True) # drop the unnamed column with the row numbers\n", "helperData.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next step, we us geolocator again to convert our helper addresses to locations.\n", "\n", "I had to find out that too many requests in a short time leads to timeouts and the for loop to crash all the time.\n", "But the **following combination of a try block and sleep function workes just fine**: " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "starting geolocator conversion:\n", "row 1 converted: Michelstrasse 6, 8049 Zürich to 47.4045882 , 8.4956993\n", "row 2 converted: Riedhofstrasse 277, 8049 Zürich to 47.4068335 , 8.486364788336479\n", "row 3 converted: Brunnwiesenstrasse. 78, 8049 Zürich to 47.401818899999995 , 8.502904109747357\n", "row 4 converted: Rütihofstrasse 32, 8049 Zürich to 47.4139362 , 8.477824429475469\n", "row 5 converted: Segantinistrasse 38, 8049 Zürich to 47.405278499999994 , 8.500653449999996\n", "row 6 converted: Riedhofstrasse 63, 8049 Zürich to 47.4047016 , 8.492083950865386\n", "row 7 converted: Riedhofstrasse 299, 8049 Zürich to 47.4077043 , 8.4850702\n", "row 8 converted: Imbisbühlstrasse 17, 8049 Zürich to 47.403117 , 8.4936818\n", "row 9 converted: Limmattalstrasse 266, 8049 Zürich to 47.4023642 , 8.4938806\n", "row 10 converted: Im Wingert 12, 8049 Zürich to 47.4003858 , 8.509406051787845\n", "row 11 converted: Kettberg 5, 8049 Zürich to 47.398512049999994 , 8.511144443967313\n", "row 12 converted: Riedhofstrasse 29, 8049 Zürich to 47.40424195 , 8.493492214249404\n", "row 13 converted: Im Wingert 36, 8049 Zürich to 47.401517850000005 , 8.50783103406484\n", "row 14 converted: Eichholzweg 6, 8049 Zürich to 47.4035913 , 8.507237738482058\n", "row 15 converted: Nötzlistrasse 15, 8049 Zürich to 47.4048336 , 8.502146001864272\n", "row 16 converted: Giacomettistrasse 19, 8049 Zürich to 47.402628500000006 , 8.505656048990708\n", "row 17 converted: Limmattalstrasse 353, 8049 Zürich to 47.4023642 , 8.4938806\n", "row 18 converted: Regensdorferstrasse 29, 8049 Zürich to 47.40405615 , 8.49537580285676\n", "row 19 converted: Winzerhalde 46, 8049 Zürich to 47.400393699999995 , 8.490019776228419\n", "row 20 converted: Kappenbühlweg 11, 8049 Zürich to 47.40397745 , 8.498320080768725\n", "row 21 converted: Segantinistrasse 125, 8049 Zürich to 47.406653649999996 , 8.493464163600624\n", "row 22 converted: Kettberg 7, 8049 Zürich to 47.398474050000004 , 8.511562547187086\n", "row 23 converted: Limmattalstrasse 388, 8049 Zürich to 47.4023642 , 8.4938806\n", "row 24 converted: Segantinistrasse 141, 8049 Zürich to 47.40724525 , 8.49231699229448\n", "row 25 converted: Riedhofstrasse 260, 8049 Zürich to 47.4073525 , 8.487545992277301\n", "row 26 converted: Winzerhalde 46, 8049 Zürich to 47.400393699999995 , 8.490019776228419\n", "row 27 converted: Riedhofstrasse 378, 8049 Zürich to 47.40997865 , 8.481313518053021\n", "row 28 converted: Giacomettistrasse 16, 8049 Zürich to 47.40261315 , 8.504931210121436\n", "row 29 converted: Limmattalstrasse 155, 8049 Zürich to 47.4009218 , 8.501674200879306\n", "row 30 converted: Limmattalstrasse 289, 8049 Zürich to 47.4023642 , 8.4938806\n", "row 31 converted: Winzerstrasse 85, 8049 Zürich to 47.4001692 , 8.4942713\n", "row 32 converted: Ottenbergstrasse 52, 8049 Zürich to 47.3982443 , 8.5082464\n", "row 33 converted: Rebstockweg 10, 8049 Zürich to 47.40084375 , 8.499320839294402\n", "row 34 converted: Limmattalstrasse 29, 8049 Zürich to 47.39646655 , 8.510388795637967\n", "row 35 converted: Ackersteinstrasse 143, 8049 Zürich to 47.398583200000004 , 8.504129803030196\n", "row 36 converted: Obere Bläsistrasse 3, 8049 Zürich to 47.40407485 , 8.504589908836735\n", "row 37 converted: Grossmannstrasse 30, 8049 Zürich to 47.3965458 , 8.506668409076683\n", "row 38 converted: Geeringstrasse 37, 8049 Zürich to 47.414803649999996 , 8.4800326180024\n", "row 39 converted: Naglerwiesenstrasse 52, 8049 Zürich to 47.4129728 , 8.481258365051458\n", "row 40 converted: Limmattalstrasse 5, 8049 Zürich to 47.3959048 , 8.51437249405286\n", "row 41 converted: Imbisbühlhalde 11, 8049 Zürich to 47.407041050000004 , 8.483379649989264\n", "row 42 converted: Segantinistrasse 114, 8049 Zürich to 47.406776750000006 , 8.494158042122827\n", "row 43 converted: Ottenbergstrasse 23, 8049 Zürich to 47.39691345 , 8.511821033987438\n", "row 44 converted: Ferdinand-Hodler-Strasse 10, 8049 Zürich to 47.40406205 , 8.5014806\n", "row 45 converted: Am Börtli 6, 8049 Zürich to 47.399609 , 8.508015663133941\n", "row 46 converted: Heizenholz 45, 8049 Zürich to 47.411592299999995 , 8.485578726437662\n", "row 47 converted: Heizenholz 45, 8049 Zürich to 47.411592299999995 , 8.485578726437662\n", "row 48 converted: Limmattalstrasse 163, 8049 Zürich to 47.40139945 , 8.50031672341791\n", "row 49 converted: Riedhofweg 35, 8049 Zürich to 47.4094958 , 8.484568246313057\n", "row 50 converted: Appenzellerstrasse 11, 8049 Zürich to 47.39936925 , 8.50878727210031\n", "row 51 converted: Segantinistrasse 216, 8049 Zürich to 47.4055211 , 8.4990666\n", "row 52 converted: Limmattalstrasse 55, 8049 Zürich to 47.397697300000004 , 8.507149700000003\n", "row 53 converted: Grossmannstrasse 30, 8049 Zürich to 47.3965458 , 8.506668409076683\n", "row 54 converted: Segantinisteig 2, 8049 Zürich to 47.40659025 , 8.492463546329287\n", "row 55 converted: Kürbergstrasse 34, 8049 Zürich to 47.39851575 , 8.50836297095779\n", "row 56 converted: Riedhofstrasse 366, 8049 Zürich to 47.4099269 , 8.482156201366113\n", "row 57 converted: Schärrergasse 3, 8049 Zürich to 47.4024113 , 8.497628509978188\n", "row 58 converted: Rütihofstrasse 2, 8049 Zürich to 47.41447625 , 8.479546130169688\n", "row 59 converted: Konrad-Ilg-Strasse 22, 8049 Zürich to 47.406844050000004 , 8.478812911455975\n", "row 60 converted: Im oberen Boden 11, 8049 Zürich to 47.4158279 , 8.4810428\n", "row 61 converted: Hohenklingenstrasse 28, 8049 Zürich to 47.40206635 , 8.492932251058683\n", "row 62 converted: Ackersteinstrasse 161, 8049 Zürich to 47.3996702 , 8.502347348296613\n", "row 63 converted: Im Maas 8, 8049 Zürich to 47.40202845 , 8.503932799627133\n", "row 64 converted: Reinhold-Frei-Strasse 27, 8049 Zürich to 47.40922205 , 8.484806457645165\n", "row 65 converted: Konrad-Ilg-Strasse 22, 8049 Zürich to 47.406844050000004 , 8.478812911455975\n", "row 66 converted: Riedhofstrasse 366, 8049 Zürich to 47.4099269 , 8.482156201366113\n", "row 67 converted: Rebbergstrasse 49, 8049 Zürich to 47.397550949999996 , 8.512940485974205\n", "row 68 converted: Ferdinand-Hodler-Strasse 15, 8049 Zürich to 47.404049 , 8.5007635\n", "row 69 converted: Kappenbühlweg 9, 8049 Zürich to 47.4035729 , 8.4986268\n", "row 70 converted: Riedhofstrasse 366, 8049 Zürich to 47.4099269 , 8.482156201366113\n", "row 71 converted: Riedhofstrasse 366, 8049 Zürich to 47.4099269 , 8.482156201366113\n", "row 72 converted: Hardeggstrasse 11, 8049 Zürich to 47.39591585 , 8.503814796285795\n", "row 73 converted: Winzerstrasse 9, 8049 Zürich to 47.4001692 , 8.4942713\n", "row 74 converted: Rütihofstrasse 32, 8049 Zürich to 47.4139362 , 8.477824429475469\n", "row 75 converted: Winzerstrasse 17, 8049 Zürich to 47.4001692 , 8.4942713\n", "row 76 converted: Segantinistrasse 116, 8049 Zürich to 47.40698605 , 8.494096435663089\n", "row 77 converted: Limmattalstrasse 387, 8049 Zürich to 47.4023642 , 8.4938806\n", "row 78 converted: Limmattalstrasse 44, 8049 Zürich to 47.3967363 , 8.510600824286353\n", "row 79 converted: Grossmannstrasse 25, 8049 Zürich to 47.3957288 , 8.507356001739868\n", "row 80 converted: Ackersteinstrasse 72, 8049 Zürich to 47.39660415 , 8.508825040147928\n", "row 81 converted: Limmattalstrasse 385, 8049 Zürich to 47.4023642 , 8.4938806\n", "row 82 converted: Limmattalstrasse 47, 8049 Zürich to 47.3972976 , 8.507906203219179\n", "row 83 converted: Ferdinand-Hodler-Strasse 3, 8049 Zürich to 47.4033394 , 8.502052907946574\n", "row 84 converted: Rütihofstrasse 27, 8049 Zürich to 47.4134899 , 8.479216234892291\n", "row 85 converted: Limmattalstrasse 65, 8049 Zürich to 47.39809405 , 8.506421018270299\n", "row 86 converted: Bergellerstrasse 41, 8049 Zürich to 47.4065698 , 8.4918502\n", "row 87 converted: Lachenacker 23, 8049 Zürich to 47.406785150000005 , 8.489951210345343\n", "row 88 converted: Michelstrasse 42, 8049 Zürich to 47.406724 , 8.495634063234608\n", "row 89 converted: Segantinistrasse 67, 8049 Zürich to 47.4055331 , 8.498280308181073\n", "row 90 converted: Kappenbühlweg 11, 8049 Zürich to 47.40397745 , 8.498320080768725\n", "row 91 converted: Heizenholz 32, 8049 Zürich to 47.411048050000005 , 8.487030915985708\n", "row 92 converted: Michelstrasse 52, 8049 Zürich to 47.40735665 , 8.49514231967135\n", "row 93 converted: Segantinistrasse 141, 8049 Zürich to 47.40724525 , 8.49231699229448\n", "row 94 converted: Wildenstrasse 15, 8049 Zürich to 47.4074537 , 8.488328928012049\n", "row 95 converted: Ackersteinstrasse 12, 8049 Zürich to 47.39557175 , 8.514209950400817\n", "row 96 converted: Bläsistrasse 49, 8049 Zürich to 47.40327485 , 8.50388585112654\n", "row 97 converted: Imbisbühlstrasse 159, 8049 Zürich to 47.4035273 , 8.4925379\n", "row 98 converted: Rütihofstrasse 3, 8049 Zürich to 47.41406945 , 8.480366719245135\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "row 99 converted: Reinhold-Frei-Strasse 67, 8049 Zürich to 47.4105669 , 8.483620068895908\n", "row 100 converted: Riedhofstrasse 41, 8049 Zürich to 47.4039369 , 8.4929601\n", "row 101 converted: Rütihofstrasse 31, 8049 Zürich to 47.4135121 , 8.478689754897568\n", "row 102 converted: Regensdorferstrasse 157, 8049 Zürich to 47.4034924 , 8.4973495\n", "row 103 converted: Im oberen Boden 72, 8049 Zürich to 47.416623 , 8.481363723023257\n", "row 104 converted: Segantinistrasse 63, 8049 Zürich to 47.4054201 , 8.498685540823669\n", "row 105 converted: Rebbergstrasse 65, 8049 Zürich to 47.3977891 , 8.5115899\n", "row 106 converted: Appenzellerstrasse 55, 8049 Zürich to 47.4006704 , 8.507789952394452\n", "row 107 converted: Kappenbühlweg 11, 8049 Zürich to 47.40397745 , 8.498320080768725\n", "row 108 converted: Heizenholz 45, 8049 Zürich to 47.411592299999995 , 8.485578726437662\n", "row 109 converted: Frankentalerstrasse 35, 8049 Zürich to 47.40705455 , 8.479552765429101\n", "row 110 converted: Bauherrenstrasse 48, 8049 Zürich to 47.401067999999995 , 8.498660900058468\n", "row 111 converted: Am Wasser 60, 8049 Zürich to 47.3960814 , 8.5061461\n", "row 112 converted: Frankentalerstrasse 35, 8049 Zürich to 47.40705455 , 8.479552765429101\n", "row 113 converted: Am Wasser 135, 8049 Zürich to 47.3991721 , 8.49784505\n", "row 114 converted: Engadinerweg 3, 8049 Zürich to 47.40721385 , 8.494296400462744\n", "row 115 converted: Riedhofstrasse 291, 8049 Zürich to 47.4075104 , 8.4859317\n", "row 116 converted: Ackersteinstrasse 150, 8049 Zürich to 47.3995796 , 8.503456578133632\n", "row 117 converted: Im Stelzenacker 17, 8049 Zürich to 47.4164693 , 8.482322248287408\n", "row 118 converted: Imbisbühlstrasse 91, 8049 Zürich to 47.4035273 , 8.4925379\n", "row 119 converted: Am Wasser 104C, 8049 Zürich to 47.3972397 , 8.5029985\n", "row 120 converted: Rütihofstrasse 45, 8049 Zürich to 47.41304865 , 8.4780279\n", "row 121 converted: Rütihofstrasse 14, 8049 Zürich to 47.41509235 , 8.47869765\n", "row 122 converted: Segantinistrasse 93, 8049 Zürich to 47.4062361 , 8.495016249999999\n", "row 123 converted: Bäulistrasse 26A, 8049 Zürich to 47.3986874 , 8.502970441951632\n", "row 124 converted: Am Börtli 10, 8049 Zürich to 47.4000024 , 8.508161923884499\n", "row 125 converted: Giblenstrasse 48, 8049 Zürich to 47.4122174 , 8.481714491018776\n", "row 126 converted: Riedhofweg 4, 8049 Zürich to 47.408466 , 8.484371898020221\n", "row 127 converted: Kürbergstrasse 50, 8049 Zürich to 47.398748499999996 , 8.510023075722788\n", "row 128 converted: Riedhofstrasse 70, 8049 Zürich to 47.40531435 , 8.492104419535483\n", "row 129 converted: Winzerhalde 85, 8049 Zürich to 47.4024914 , 8.485379154222267\n", "row 130 converted: Gsteigstrasse 31, 8049 Zürich to 47.4030586 , 8.5019213\n" ] } ], "source": [ "helpLat=[] # list to store latitutes\n", "helpLong= [] # list to store longitudes\n", "location=None # variable to check if geolocator returned a results\n", "count=0 # counter for converted addresses \n", "\n", "print('starting geolocator conversion:')\n", "for tmpAddr in helperData['address']:\n", " while(location is None): # try to use geolocator until a result is returned\n", " try: \n", " location = geolocator.geocode(tmpAddr) # try converting address to gps position\n", " count+=1\n", " helpLat.append(location.latitude) # append latitude to list\n", " helpLong.append(location.longitude) # append longitude to list\n", " print('row',count,'converted:',tmpAddr,'to',location.latitude,',',location.longitude)\n", " except: # in case geocoder times out, wait half a second \n", " #print('.',end='') # uncomment to see how many attempts failed\n", " time.sleep(0.5) #wait half a second\n", " location=None" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of elements in the list helpLat: 130\n", "Number of elements in the list helpLong: 130\n" ] } ], "source": [ "print('Number of elements in the list helpLat: ',len(helpLat))\n", "print('Number of elements in the list helpLong:',len(helpLong))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Seems to have worked.\n", "\n", "Now let's **add the resulting geoposition rows to our helper dataframe**, name the columns and have a look at the resulting dataframe." ] }, { "cell_type": "code", "execution_count": 16, "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>address</th>\n", " <th>latitude</th>\n", " <th>longitude</th>\n", " </tr>\n", " <tr>\n", " <th>helperId</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>Michelstrasse 6, 8049 Zürich</td>\n", " <td>47.404588</td>\n", " <td>8.495699</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>Riedhofstrasse 277, 8049 Zürich</td>\n", " <td>47.406833</td>\n", " <td>8.486365</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>Brunnwiesenstrasse. 78, 8049 Zürich</td>\n", " <td>47.401819</td>\n", " <td>8.502904</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>Rütihofstrasse 32, 8049 Zürich</td>\n", " <td>47.413936</td>\n", " <td>8.477824</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>Segantinistrasse 38, 8049 Zürich</td>\n", " <td>47.405278</td>\n", " <td>8.500653</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " address latitude longitude\n", "helperId \n", "0 Michelstrasse 6, 8049 Zürich 47.404588 8.495699\n", "1 Riedhofstrasse 277, 8049 Zürich 47.406833 8.486365\n", "2 Brunnwiesenstrasse. 78, 8049 Zürich 47.401819 8.502904\n", "3 Rütihofstrasse 32, 8049 Zürich 47.413936 8.477824\n", "4 Segantinistrasse 38, 8049 Zürich 47.405278 8.500653" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData['latitude']=helpLat\n", "helperData['longitude']=helpLong\n", "helperData.index.name='helperId'\n", "helperData.head()" ] }, { "cell_type": "code", "execution_count": 17, "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>address</th>\n", " <th>latitude</th>\n", " <th>longitude</th>\n", " </tr>\n", " <tr>\n", " <th>helperId</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>125</th>\n", " <td>Riedhofweg 4, 8049 Zürich</td>\n", " <td>47.408466</td>\n", " <td>8.484372</td>\n", " </tr>\n", " <tr>\n", " <th>126</th>\n", " <td>Kürbergstrasse 50, 8049 Zürich</td>\n", " <td>47.398748</td>\n", " <td>8.510023</td>\n", " </tr>\n", " <tr>\n", " <th>127</th>\n", " <td>Riedhofstrasse 70, 8049 Zürich</td>\n", " <td>47.405314</td>\n", " <td>8.492104</td>\n", " </tr>\n", " <tr>\n", " <th>128</th>\n", " <td>Winzerhalde 85, 8049 Zürich</td>\n", " <td>47.402491</td>\n", " <td>8.485379</td>\n", " </tr>\n", " <tr>\n", " <th>129</th>\n", " <td>Gsteigstrasse 31, 8049 Zürich</td>\n", " <td>47.403059</td>\n", " <td>8.501921</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " address latitude longitude\n", "helperId \n", "125 Riedhofweg 4, 8049 Zürich 47.408466 8.484372\n", "126 Kürbergstrasse 50, 8049 Zürich 47.398748 8.510023\n", "127 Riedhofstrasse 70, 8049 Zürich 47.405314 8.492104\n", "128 Winzerhalde 85, 8049 Zürich 47.402491 8.485379\n", "129 Gsteigstrasse 31, 8049 Zürich 47.403059 8.501921" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we **create and add some fake email addresses** for our helpers:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# create a list of fake names and email addresses\n", "fake = Faker(['de_DE']) \n", "helperEmail=[]\n", "for i in range(len(helperData)):\n", " helperEmail.append(fake.email())" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['olena23@web.de',\n", " 'abdul37@lorch.de',\n", " 'ron06@etzler.org',\n", " 'stanislaw11@gorlitz.com',\n", " 'dorleboerner@aol.de']" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check result\n", "helperEmail[:5]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# add fake email addresses to our dataframe\n", "helperData['email']=helperEmail" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Have a final look at our dataframe:" ] }, { "cell_type": "code", "execution_count": 21, "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>address</th>\n", " <th>latitude</th>\n", " <th>longitude</th>\n", " <th>email</th>\n", " </tr>\n", " <tr>\n", " <th>helperId</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>Michelstrasse 6, 8049 Zürich</td>\n", " <td>47.404588</td>\n", " <td>8.495699</td>\n", " <td>olena23@web.de</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>Riedhofstrasse 277, 8049 Zürich</td>\n", " <td>47.406833</td>\n", " <td>8.486365</td>\n", " <td>abdul37@lorch.de</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>Brunnwiesenstrasse. 78, 8049 Zürich</td>\n", " <td>47.401819</td>\n", " <td>8.502904</td>\n", " <td>ron06@etzler.org</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>Rütihofstrasse 32, 8049 Zürich</td>\n", " <td>47.413936</td>\n", " <td>8.477824</td>\n", " <td>stanislaw11@gorlitz.com</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>Segantinistrasse 38, 8049 Zürich</td>\n", " <td>47.405278</td>\n", " <td>8.500653</td>\n", " <td>dorleboerner@aol.de</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " address latitude longitude \\\n", "helperId \n", "0 Michelstrasse 6, 8049 Zürich 47.404588 8.495699 \n", "1 Riedhofstrasse 277, 8049 Zürich 47.406833 8.486365 \n", "2 Brunnwiesenstrasse. 78, 8049 Zürich 47.401819 8.502904 \n", "3 Rütihofstrasse 32, 8049 Zürich 47.413936 8.477824 \n", "4 Segantinistrasse 38, 8049 Zürich 47.405278 8.500653 \n", "\n", " email \n", "helperId \n", "0 olena23@web.de \n", "1 abdul37@lorch.de \n", "2 ron06@etzler.org \n", "3 stanislaw11@gorlitz.com \n", "4 dorleboerner@aol.de " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks good to me.\n", "\n", "How about saving our work to a csv in case anything goes wrong:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "helperData.to_csv('helperData.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**With that, our manual data gathering part for our ficticious helpers and customer is done.**\n", "\n", "----" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<a id = \"tldr1evenfurther\"></a>\n", "### customers and helper geolocations visualized on a map\n", "Now let's visualize the helpers and our customer on the map.\n", "\n", "The customer is represented with a red circle and the possible helpers with blue circles." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# helperData = pd.read_csv('helperData.csv') # uncomment in case you want to proceed from here" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><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+ICNtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTAgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZDZmZjI4ZmQ2MDc4NDM1OTgwYmY5NzBiZTI0MzVmMmIgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhNDM0OGRhY2VkMzQ2YTc4ZmJiNmJiNjFiMzgxNTg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTkxM2QwOGY0NDg0ZmEyYTE2MjU4ODIwMjFlYmQ1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NGIwNjhjNzFmMmY0NDdjYWY3MGQyMTRjM2E2YWVmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjRiMDY4YzcxZjJmNDQ3Y2FmNzBkMjE0YzNhNmFlZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdzdGVpZ3N0cmFzc2UgOSwgODA0OSBadXJpY2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxOTEzZDA4ZjQ0ODRmYTJhMTYyNTg4MjAyMWViZDU4LnNldENvbnRlbnQoaHRtbF82NGIwNjhjNzFmMmY0NDdjYWY3MGQyMTRjM2E2YWVmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTQzNDhkYWNlZDM0NmE3OGZiYjZiYjYxYjM4MTU4NC5iaW5kUG9wdXAocG9wdXBfZDE5MTNkMDhmNDQ4NGZhMmExNjI1ODgyMDIxZWJkNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWRiZjYzYmU5NGRlNDVkNjllMTJkZDdmNjQ3ZDA3ZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQ1ODgyLDguNDk1Njk5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NTNmYjY3YTg5OWI0MTc1YTk1MmQ5YTEwMGIzYzA2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDJiY2VkNDhmM2E0NTI3YTdjNzM5YjE0MjY2NTY2ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2QyYmNlZDQ4ZjNhNDUyN2E3YzczOWIxNDI2NjU2NmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm9sZW5hMjNAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTNmYjY3YTg5OWI0MTc1YTk1MmQ5YTEwMGIzYzA2OS5zZXRDb250ZW50KGh0bWxfN2QyYmNlZDQ4ZjNhNDUyN2E3YzczOWIxNDI2NjU2NmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWRiZjYzYmU5NGRlNDVkNjllMTJkZDdmNjQ3ZDA3ZmYuYmluZFBvcHVwKHBvcHVwXzQ1M2ZiNjdhODk5YjQxNzVhOTUyZDlhMTAwYjNjMDY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkxMWFkNjZlZjA1NDRlODJhYTU1ZGRkZjE2YzA2YzJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2ODMzNSw4LjQ4NjM2NDc4ODMzNjQ3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDY3MjdkNWI5MTY0OWY3OTE5MTFkNzE1ZTM2ODVmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OTUwMDdkMjIyYjI0MGU4OGQwNjJhMDkyOGNiYThiNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjk1MDA3ZDIyMmIyNDBlODhkMDYyYTA5MjhjYmE4YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFiZHVsMzdAbG9yY2guZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwNjcyN2Q1YjkxNjQ5Zjc5MTkxMWQ3MTVlMzY4NWY4LnNldENvbnRlbnQoaHRtbF82OTUwMDdkMjIyYjI0MGU4OGQwNjJhMDkyOGNiYThiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MTFhZDY2ZWYwNTQ0ZTgyYWE1NWRkZGYxNmMwNmMyYS5iaW5kUG9wdXAocG9wdXBfMTA2NzI3ZDViOTE2NDlmNzkxOTExZDcxNWUzNjg1ZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmE4ZGRjZGM0NDc3NGFhMDk2N2ZjODEzMjA1YjRjOWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDE4MTg4OTk5OTk5OTUsOC41MDI5MDQxMDk3NDczNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTMxZTIzYTk1MjdhNDQ2ZThhZTY0MzJkMzI1MjI2ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E3MDI5MjU2YWM0NDJmOWJmZjkwNjUyMjUzNTBlNWIgPSAkKCc8ZGl2IGlkPSJodG1sX2NhNzAyOTI1NmFjNDQyZjliZmY5MDY1MjI1MzUwZTViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yb24wNkBldHpsZXIub3JnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MzFlMjNhOTUyN2E0NDZlOGFlNjQzMmQzMjUyMjZmYi5zZXRDb250ZW50KGh0bWxfY2E3MDI5MjU2YWM0NDJmOWJmZjkwNjUyMjUzNTBlNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmE4ZGRjZGM0NDc3NGFhMDk2N2ZjODEzMjA1YjRjOWIuYmluZFBvcHVwKHBvcHVwXzUzMWUyM2E5NTI3YTQ0NmU4YWU2NDMyZDMyNTIyNmZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkODIwNDVlYzZkYzQyOThhYTk1MGUxNmVhYzdkMWNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzOTM2Miw4LjQ3NzgyNDQyOTQ3NTQ2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYjYwODc2NWU1NTY0ZTM0YTliMjczZjNjOGRhODI1ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZDU1MzBiM2Q3MzQ0ZWU5YWY3YmViZjJmZWEzMGZhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWQ1NTMwYjNkNzM0NGVlOWFmN2JlYmYyZmVhMzBmYTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0YW5pc2xhdzExQGdvcmxpdHouY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYjYwODc2NWU1NTY0ZTM0YTliMjczZjNjOGRhODI1ZS5zZXRDb250ZW50KGh0bWxfOWQ1NTMwYjNkNzM0NGVlOWFmN2JlYmYyZmVhMzBmYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmQ4MjA0NWVjNmRjNDI5OGFhOTUwZTE2ZWFjN2QxY2YuYmluZFBvcHVwKHBvcHVwX2ZiNjA4NzY1ZTU1NjRlMzRhOWIyNzNmM2M4ZGE4MjVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1MTM5ZGQwODkwMjQxYmU4ZmVhN2M4YzU2ODNmZmZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA1Mjc4NDk5OTk5OTk0LDguNTAwNjUzNDQ5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzODFmNmUyOTQ1ODQ0YWFhYzc5M2VlM2RlMTlmYTBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmMjNlY2Q1MjhkOTQ1ODhiMzI0NTE2MTZjOGRhMjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF85ZjIzZWNkNTI4ZDk0NTg4YjMyNDUxNjE2YzhkYTI0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZG9ybGVib2VybmVyQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDM4MWY2ZTI5NDU4NDRhYWFjNzkzZWUzZGUxOWZhMGYuc2V0Q29udGVudChodG1sXzlmMjNlY2Q1MjhkOTQ1ODhiMzI0NTE2MTZjOGRhMjQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1MTM5ZGQwODkwMjQxYmU4ZmVhN2M4YzU2ODNmZmZiLmJpbmRQb3B1cChwb3B1cF9kMzgxZjZlMjk0NTg0NGFhYWM3OTNlZTNkZTE5ZmEwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mODBkYzk1NWM5M2U0ZjJlOTk2YzBkNmNkZjczYzFmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDcwMTYsOC40OTIwODM5NTA4NjUzODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGQ0OGZmYzUwZWU0NGM1OGI0YWI1ODljNWNiMjg4MGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhmNDBlMmVmMmZhNDIxZWIzZWE2OWM0MGI1MDI3M2QgPSAkKCc8ZGl2IGlkPSJodG1sX2M4ZjQwZTJlZjJmYTQyMWViM2VhNjljNDBiNTAyNzNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ua3JhdXNlQHJlaW5oYXJkdC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkNDhmZmM1MGVlNDRjNThiNGFiNTg5YzVjYjI4ODBjLnNldENvbnRlbnQoaHRtbF9jOGY0MGUyZWYyZmE0MjFlYjNlYTY5YzQwYjUwMjczZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODBkYzk1NWM5M2U0ZjJlOTk2YzBkNmNkZjczYzFmYi5iaW5kUG9wdXAocG9wdXBfZGQ0OGZmYzUwZWU0NGM1OGI0YWI1ODljNWNiMjg4MGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2VlYzZjYTdlNjZjNDFkZGI2NjliNGI1NjdlOGVhMzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDc3MDQzLDguNDg1MDcwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81N2ZjNDgzOGZhOTk0NjNlYWQ2MjQ2NjgyYTM5ZmE1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NWI4YzZkYzU3Y2E0M2M3ODFmNjA2Y2M4YWM0YzE2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfODViOGM2ZGM1N2NhNDNjNzgxZjYwNmNjOGFjNGMxNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmpvZXJnZW42OEBoZXVzZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3ZmM0ODM4ZmE5OTQ2M2VhZDYyNDY2ODJhMzlmYTU4LnNldENvbnRlbnQoaHRtbF84NWI4YzZkYzU3Y2E0M2M3ODFmNjA2Y2M4YWM0YzE2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZWVjNmNhN2U2NmM0MWRkYjY2OWI0YjU2N2U4ZWEzOS5iaW5kUG9wdXAocG9wdXBfNTdmYzQ4MzhmYTk5NDYzZWFkNjI0NjY4MmEzOWZhNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGYzNzNlN2RmMWI1NDk1MGE3ZjQzNjRmZTUzYzdmMzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMxMTcsOC40OTM2ODE4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3M2ZlM2ZhMjVkZjRlMDhhMTFiMWVjYjYyNDY0NmYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxZDdkYTEwMzU5MDQwZjY4NWM4MTcxZGE5NWE0ZWYzID0gJCgnPGRpdiBpZD0iaHRtbF80MWQ3ZGExMDM1OTA0MGY2ODVjODE3MWRhOTVhNGVmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3VzY2hrYXJsLWF1Z3VzdEBob2x6YXBmZWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3M2ZlM2ZhMjVkZjRlMDhhMTFiMWVjYjYyNDY0NmYyLnNldENvbnRlbnQoaHRtbF80MWQ3ZGExMDM1OTA0MGY2ODVjODE3MWRhOTVhNGVmMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjM3M2U3ZGYxYjU0OTUwYTdmNDM2NGZlNTNjN2YzMy5iaW5kUG9wdXAocG9wdXBfNDczZmUzZmEyNWRmNGUwOGExMWIxZWNiNjI0NjQ2ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzJhODA4NzllZmVjNGJjZTkxZmVkMTRkZTM4N2YwYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzczZDNiNmJhYjc0NmQyOWE2ZDU5ZmRiNzc1ZTZiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjE5NTdjOTU2MGE0NDVhYjI0NDJmYzU3MTYyZjVmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGYxOTU3Yzk1NjBhNDQ1YWIyNDQyZmM1NzE2MmY1ZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1ldGluMzRAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzczZDNiNmJhYjc0NmQyOWE2ZDU5ZmRiNzc1ZTZiOC5zZXRDb250ZW50KGh0bWxfOGYxOTU3Yzk1NjBhNDQ1YWIyNDQyZmM1NzE2MmY1ZmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzJhODA4NzllZmVjNGJjZTkxZmVkMTRkZTM4N2YwYTkuYmluZFBvcHVwKHBvcHVwXzg3NzNkM2I2YmFiNzQ2ZDI5YTZkNTlmZGI3NzVlNmI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1Y2VmZTAyZjc5ZjRjMDc5ZDI2ZTExMzVmNjBlZDFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMzg1OCw4LjUwOTQwNjA1MTc4Nzg0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjYyZDZjOWNjMzQ0YTI5OTBmMjkyMDMzMGFjZGU0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTY0NTgyNGYxNzc0ZmM5ODNhOTYwNzlmNDFhZTNiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNzk2NDU4MjRmMTc3NGZjOTgzYTk2MDc5ZjQxYWUzYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1hcmljYWp1bmNrQG5ldXNjaGFlZmVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjYyZDZjOWNjMzQ0YTI5OTBmMjkyMDMzMGFjZGU0Yy5zZXRDb250ZW50KGh0bWxfNzk2NDU4MjRmMTc3NGZjOTgzYTk2MDc5ZjQxYWUzYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzVjZWZlMDJmNzlmNGMwNzlkMjZlMTEzNWY2MGVkMWMuYmluZFBvcHVwKHBvcHVwX2M2NjJkNmM5Y2MzNDRhMjk5MGYyOTIwMzMwYWNkZTRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2YjJjNDQyOTcyYjQ2ZGZhZGQzMDJhNzE4MTE4YWNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NTEyMDQ5OTk5OTk0LDguNTExMTQ0NDQzOTY3MzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmN2FkOTE4ZGRmOTQ2OTI4NzQ0YjEwMDhkOGI0OGZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIwYTNkN2U1NjVmNDRhYTc5ZDBhMGFlNWZiNDFhNDA3ID0gJCgnPGRpdiBpZD0iaHRtbF8yMGEzZDdlNTY1ZjQ0YWE3OWQwYTBhZTVmYjQxYTQwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWJvaGxhbmRlckBzZWlmZXJ0LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZjdhZDkxOGRkZjk0NjkyODc0NGIxMDA4ZDhiNDhmZi5zZXRDb250ZW50KGh0bWxfMjBhM2Q3ZTU2NWY0NGFhNzlkMGEwYWU1ZmI0MWE0MDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzZiMmM0NDI5NzJiNDZkZmFkZDMwMmE3MTgxMThhY2YuYmluZFBvcHVwKHBvcHVwXzhmN2FkOTE4ZGRmOTQ2OTI4NzQ0YjEwMDhkOGI0OGZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxNmI5Y2NjYzNiZTRlMzk4Njg5ZjY2OTA4MDc3YzVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MjQxOTUsOC40OTM0OTIyMTQyNDk0MDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjg1OGRiNjc2OWU1NDNiZDhhMThkMWJkOGI2NTllMjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTAwNWUwZjFjZjZmNGI5NmE0ODQ3NWQ1M2QxNTA0MmUgPSAkKCc8ZGl2IGlkPSJodG1sX2EwMDVlMGYxY2Y2ZjRiOTZhNDg0NzVkNTNkMTUwNDJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGlmZmVsZG9uYWxkQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ODU4ZGI2NzY5ZTU0M2JkOGExOGQxYmQ4YjY1OWUyNC5zZXRDb250ZW50KGh0bWxfYTAwNWUwZjFjZjZmNGI5NmE0ODQ3NWQ1M2QxNTA0MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzE2YjljY2NjM2JlNGUzOTg2ODlmNjY5MDgwNzdjNWMuYmluZFBvcHVwKHBvcHVwXzY4NThkYjY3NjllNTQzYmQ4YTE4ZDFiZDhiNjU5ZTI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1MzhhM2Y1N2U5ODQ3YzI4YjVhZmIzYzdiNGEwMmMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAxNTE3ODUwMDAwMDA1LDguNTA3ODMxMDM0MDY0ODRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjlkZGJhMzFhNmQ4NDAyYTg3MGRmMDJlMjc3NTk3ZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjhjODZhYzRiYjk3NGY5YmFmOTEzZTdmYTBjMjAzNjEgPSAkKCc8ZGl2IGlkPSJodG1sXzI4Yzg2YWM0YmI5NzRmOWJhZjkxM2U3ZmEwYzIwMzYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56cnVwcGVydEBsb2V3ZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5ZGRiYTMxYTZkODQwMmE4NzBkZjAyZTI3NzU5N2YxLnNldENvbnRlbnQoaHRtbF8yOGM4NmFjNGJiOTc0ZjliYWY5MTNlN2ZhMGMyMDM2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NTM4YTNmNTdlOTg0N2MyOGI1YWZiM2M3YjRhMDJjMy5iaW5kUG9wdXAocG9wdXBfYjlkZGJhMzFhNmQ4NDAyYTg3MGRmMDJlMjc3NTk3ZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjA3YzQwYzZjNTMzNDkwYjhmZWJiMmU1NTY2NmJkM2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1OTEzLDguNTA3MjM3NzM4NDgyMDU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyYWMzMzBhMDZlYzQzNDM4ZWRjZGUxNjIzMDk5NWE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiNjUwNDJlMWQxYzRjMjNhOGEyMmIwMDU4Y2NmNGMyID0gJCgnPGRpdiBpZD0iaHRtbF8wYjY1MDQyZTFkMWM0YzIzYThhMjJiMDA1OGNjZjRjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cmFsZi1kaWV0ZXJrcmV1c2VsQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDJhYzMzMGEwNmVjNDM0MzhlZGNkZTE2MjMwOTk1YTcuc2V0Q29udGVudChodG1sXzBiNjUwNDJlMWQxYzRjMjNhOGEyMmIwMDU4Y2NmNGMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwN2M0MGM2YzUzMzQ5MGI4ZmViYjJlNTU2NjZiZDNmLmJpbmRQb3B1cChwb3B1cF9kMmFjMzMwYTA2ZWM0MzQzOGVkY2RlMTYyMzA5OTVhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MzQ4N2Q0NmU0ODE0ZmQ4YThmNjRjMGY4OWM3MmU3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDgzMzYsOC41MDIxNDYwMDE4NjQyNzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzUzZmMzMDViM2ZlNDI0YmIwY2E1NTE5MjRjNTMzMzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGFkYzI5NGI3NWJmNDY3YzhmNWM3ZjIxMTIyM2U1OTYgPSAkKCc8ZGl2IGlkPSJodG1sXzhhZGMyOTRiNzViZjQ2N2M4ZjVjN2YyMTEyMjNlNTk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5iYXJraG9senZhbGVudGluZUBiYXJ0aC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzUzZmMzMDViM2ZlNDI0YmIwY2E1NTE5MjRjNTMzMzkuc2V0Q29udGVudChodG1sXzhhZGMyOTRiNzViZjQ2N2M4ZjVjN2YyMTEyMjNlNTk2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzNDg3ZDQ2ZTQ4MTRmZDhhOGY2NGMwZjg5YzcyZTdlLmJpbmRQb3B1cChwb3B1cF83NTNmYzMwNWIzZmU0MjRiYjBjYTU1MTkyNGM1MzMzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MzRlZTA1ZDk0ZDE0OWVkODZlOThiNDJjNGRjZjVjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjYyODUwMDAwMDAwNiw4LjUwNTY1NjA0ODk5MDcwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjA5NTE5ODBjNmM0NDk0ODgzNGI2MWFlM2VmMTdlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZGQ5NmY5ZDM3ZWU0Y2Y1YTA0NmQ5NzJmNTVjODhlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWRkOTZmOWQzN2VlNGNmNWEwNDZkOTcyZjU1Yzg4ZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFuaWthMzhAcm9odC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2MDk1MTk4MGM2YzQ0OTQ4ODM0YjYxYWUzZWYxN2ViLnNldENvbnRlbnQoaHRtbF8xZGQ5NmY5ZDM3ZWU0Y2Y1YTA0NmQ5NzJmNTVjODhlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MzRlZTA1ZDk0ZDE0OWVkODZlOThiNDJjNGRjZjVjNy5iaW5kUG9wdXAocG9wdXBfNjYwOTUxOTgwYzZjNDQ5NDg4MzRiNjFhZTNlZjE3ZWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDQ2YzA2ZGZjNGU5NDc1NDhmZDU5YTNjNzVjODE0NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNWRhNzZmZmRhNTI0YWU3OWEzOTg2MTgyMzU5ZGE5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOGFjNGRkNjVmOTE0ZTYzOTFjNzE3ZTkyZGEwNmJlNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMThhYzRkZDY1ZjkxNGU2MzkxYzcxN2U5MmRhMDZiZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmVob2VybGVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNWRhNzZmZmRhNTI0YWU3OWEzOTg2MTgyMzU5ZGE5Yy5zZXRDb250ZW50KGh0bWxfMThhYzRkZDY1ZjkxNGU2MzkxYzcxN2U5MmRhMDZiZTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDQ2YzA2ZGZjNGU5NDc1NDhmZDU5YTNjNzVjODE0NTkuYmluZFBvcHVwKHBvcHVwX2E1ZGE3NmZmZGE1MjRhZTc5YTM5ODYxODIzNTlkYTljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiNjAyODlmY2Q3MzRkNjg5MzcyYTQ0Yzg1ZTg3MjcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MDU2MTUsOC40OTUzNzU4MDI4NTY3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDAxZGM1ZWQyMDY0N2Q2OTZlNjE5YzQwZGJjMDFkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjIzYzMzNjliZmQ0ZWE5ODUwNjllMzVlNDQ3NWNlYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTYyM2MzMzY5YmZkNGVhOTg1MDY5ZTM1ZTQ0NzVjZWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFubmVsaTA1QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAwMWRjNWVkMjA2NDdkNjk2ZTYxOWM0MGRiYzAxZDkuc2V0Q29udGVudChodG1sXzE2MjNjMzM2OWJmZDRlYTk4NTA2OWUzNWU0NDc1Y2VhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiNjAyODlmY2Q3MzRkNjg5MzcyYTQ0Yzg1ZTg3MjcxLmJpbmRQb3B1cChwb3B1cF8zMDAxZGM1ZWQyMDY0N2Q2OTZlNjE5YzQwZGJjMDFkOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODNmZWRjMjM1MDk0NDFmODE4ODRlMzVlNDQ5ZWIxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDM5MzY5OTk5OTk5NSw4LjQ5MDAxOTc3NjIyODQxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTA2NjFkN2U0Njk0NTk5YmVmMjgyZmU2NWYyMTBiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMWE5NWQxODQwOTg0ZTdjYjI3N2EyNTY2MTY2YzIxYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjFhOTVkMTg0MDk4NGU3Y2IyNzdhMjU2NjE2NmMyMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnpyaXR0ZXJAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTA2NjFkN2U0Njk0NTk5YmVmMjgyZmU2NWYyMTBiMC5zZXRDb250ZW50KGh0bWxfYjFhOTVkMTg0MDk4NGU3Y2IyNzdhMjU2NjE2NmMyMWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTgzZmVkYzIzNTA5NDQxZjgxODg0ZTM1ZTQ0OWViMTkuYmluZFBvcHVwKHBvcHVwX2I1MDY2MWQ3ZTQ2OTQ1OTliZWYyODJmZTY1ZjIxMGIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2YTcxNGM3MDVlMTRiYmM4MmIzNzFiYWY0YTllZjk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTc3NDUsOC40OTgzMjAwODA3Njg3MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWY3YTRiNmNlNDZiNGM1MTlmN2Q2YjgxMDY3YmRmZDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTExNzBiNTk2ZjhlNDExMzgzMjQ2ZGE0MjJjZGJhMTQgPSAkKCc8ZGl2IGlkPSJodG1sX2ExMTcwYjU5NmY4ZTQxMTM4MzI0NmRhNDIyY2RiYTE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5iYmFjaG1hbm5Ad2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZjdhNGI2Y2U0NmI0YzUxOWY3ZDZiODEwNjdiZGZkOS5zZXRDb250ZW50KGh0bWxfYTExNzBiNTk2ZjhlNDExMzgzMjQ2ZGE0MjJjZGJhMTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjZhNzE0YzcwNWUxNGJiYzgyYjM3MWJhZjRhOWVmOTguYmluZFBvcHVwKHBvcHVwXzVmN2E0YjZjZTQ2YjRjNTE5ZjdkNmI4MTA2N2JkZmQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0YTM5YWEzYThmYjQ0MGY5YzQ2NjZhZDE3ZTE4ZDc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2NjUzNjQ5OTk5OTk2LDguNDkzNDY0MTYzNjAwNjI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiYzM0MGE0ZmQyNjQ3ZmU4MDk4MzVhOGVjMGYyMTA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3Mjc5OWVlODRiNDQyYzU4YzczN2ExOGQ1NzlhODdjID0gJCgnPGRpdiBpZD0iaHRtbF9jNzI3OTllZTg0YjQ0MmM1OGM3MzdhMThkNTc5YTg3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWhlc2VyQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGJjMzQwYTRmZDI2NDdmZTgwOTgzNWE4ZWMwZjIxMDkuc2V0Q29udGVudChodG1sX2M3Mjc5OWVlODRiNDQyYzU4YzczN2ExOGQ1NzlhODdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M0YTM5YWEzYThmYjQ0MGY5YzQ2NjZhZDE3ZTE4ZDc1LmJpbmRQb3B1cChwb3B1cF9kYmMzNDBhNGZkMjY0N2ZlODA5ODM1YThlYzBmMjEwOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZGUxOTk1YzhkYTk0OGYxOWUzOTlmZGUzZWY5NTMyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODQ3NDA1MDAwMDAwNCw4LjUxMTU2MjU0NzE4NzA4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mM2U4ZmY3MDgzYmU0OWU4OGJkMDZhOGU1MjgxMTgxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMDZlODZhNWQ4NGM0ODM2YTBjYjU0ZjU5OWEwNGZjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjA2ZTg2YTVkODRjNDgzNmEwY2I1NGY1OTlhMDRmY2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnFub2Fja0Bob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mM2U4ZmY3MDgzYmU0OWU4OGJkMDZhOGU1MjgxMTgxYS5zZXRDb250ZW50KGh0bWxfZjA2ZTg2YTVkODRjNDgzNmEwY2I1NGY1OTlhMDRmY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2RlMTk5NWM4ZGE5NDhmMTllMzk5ZmRlM2VmOTUzMmYuYmluZFBvcHVwKHBvcHVwX2YzZThmZjcwODNiZTQ5ZTg4YmQwNmE4ZTUyODExODFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiMzViNWZlODhiNjRmMDRiMGU1N2YwZjM5MDQ5Njg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWYwM2MyYTY5ZDZlNGIyMGE1OTM0MzI4YmMwOTE3YWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWEwNmRkZTA1NDA1NDAxNjg4YTEyZmE1NDY2MjA2MWYgPSAkKCc8ZGl2IGlkPSJodG1sX2FhMDZkZGUwNTQwNTQwMTY4OGExMmZhNTQ2NjIwNjFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5qb3NlZjk1QGJvZXJuZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjAzYzJhNjlkNmU0YjIwYTU5MzQzMjhiYzA5MTdhZS5zZXRDb250ZW50KGh0bWxfYWEwNmRkZTA1NDA1NDAxNjg4YTEyZmE1NDY2MjA2MWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2IzNWI1ZmU4OGI2NGYwNGIwZTU3ZjBmMzkwNDk2ODcuYmluZFBvcHVwKHBvcHVwX2VmMDNjMmE2OWQ2ZTRiMjBhNTkzNDMyOGJjMDkxN2FlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyNGIxZWE1NmZiODQxMjRhODNjMTkzYTBhMjc1N2E0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MjQ1MjUsOC40OTIzMTY5OTIyOTQ0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjczYzE1ZDIzNzg0NjU3OTcwMjRkNmY3ZjNmNjY4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YjYxYmM4ZTI5MWU0OWNmODYyNTdhMWJhOGY4YThiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWI2MWJjOGUyOTFlNDljZjg2MjU3YTFiYThmOGE4YmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1laW5oYXJkYm9sem1hbm5Ad2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjczYzE1ZDIzNzg0NjU3OTcwMjRkNmY3ZjNmNjY4OC5zZXRDb250ZW50KGh0bWxfNWI2MWJjOGUyOTFlNDljZjg2MjU3YTFiYThmOGE4YmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjI0YjFlYTU2ZmI4NDEyNGE4M2MxOTNhMGEyNzU3YTQuYmluZFBvcHVwKHBvcHVwX2UyNzNjMTVkMjM3ODQ2NTc5NzAyNGQ2ZjdmM2Y2Njg4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyZTcxMjkwZThkZjQ0ZjY5YTEyNWI1NjQ3MjcxMWNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MzUyNSw4LjQ4NzU0NTk5MjI3NzMwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzUxYzE3OTM2MTc0MjJkODFiYTk3MWU2M2NiMWU2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MmUwNmI3MWM5MzE0NmE0OTY1ZGVkNTk5ZjU2MjgzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfODJlMDZiNzFjOTMxNDZhNDk2NWRlZDU5OWY1NjI4MzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhlbm5lcmhvZmZtYW5uQHppcm1lLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGM1MWMxNzkzNjE3NDIyZDgxYmE5NzFlNjNjYjFlNmQuc2V0Q29udGVudChodG1sXzgyZTA2YjcxYzkzMTQ2YTQ5NjVkZWQ1OTlmNTYyODM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyZTcxMjkwZThkZjQ0ZjY5YTEyNWI1NjQ3MjcxMWNlLmJpbmRQb3B1cChwb3B1cF9kYzUxYzE3OTM2MTc0MjJkODFiYTk3MWU2M2NiMWU2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNmEzYjA4ZTJkMTQ0NTM0YmNlOTMzZWI2YzA3ODdhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDM5MzY5OTk5OTk5NSw4LjQ5MDAxOTc3NjIyODQxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZmNmOTQ2OGU1MTE0OWRjOWFhNzkzNTJjZjc0ODkyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZGM5YzRlYmI0OWE0MWJmOGFkNzMxYjk3OGY5Mzc4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGRjOWM0ZWJiNDlhNDFiZjhhZDczMWI5NzhmOTM3OGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndydXBwZXJ0QGd1ZGUuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmY2Y5NDY4ZTUxMTQ5ZGM5YWE3OTM1MmNmNzQ4OTJhLnNldENvbnRlbnQoaHRtbF84ZGM5YzRlYmI0OWE0MWJmOGFkNzMxYjk3OGY5Mzc4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNmEzYjA4ZTJkMTQ0NTM0YmNlOTMzZWI2YzA3ODdhMC5iaW5kUG9wdXAocG9wdXBfMmZjZjk0NjhlNTExNDlkYzlhYTc5MzUyY2Y3NDg5MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTg1NjVkYTBiNmMwNDgwMWExYTEzYzZhMjljN2I4ZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk5Nzg2NSw4LjQ4MTMxMzUxODA1MzAyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZDhlNGJlMDliODk0YzhhYWNlMzdlM2Y1YjA5NDA0NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzQwOTliNGRmZmE0MjlhODk1Y2Y0NjI2MDE0MTQ0NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTM0MDk5YjRkZmZhNDI5YTg5NWNmNDYyNjAxNDE0NDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJyaWdpdHRlbWFyZ3JhZkBtYXJncmFmLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWQ4ZTRiZTA5Yjg5NGM4YWFjZTM3ZTNmNWIwOTQwNDQuc2V0Q29udGVudChodG1sX2EzNDA5OWI0ZGZmYTQyOWE4OTVjZjQ2MjYwMTQxNDQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4NTY1ZGEwYjZjMDQ4MDFhMWExM2M2YTI5YzdiOGQ3LmJpbmRQb3B1cChwb3B1cF85ZDhlNGJlMDliODk0YzhhYWNlMzdlM2Y1YjA5NDA0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjlhNzAzYjk5NTU0ZmQwYmU1MDU1ZjkxMGY0MzU3MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjYxMzE1LDguNTA0OTMxMjEwMTIxNDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2NmY2ZDI3ZDNmMDQ0ZjM4ZTdmY2ZjOTkzOWY1OWJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzZjNkNTdiNzhhNzQ2NWJiMmVmNmM3NDc3NGZkMjIzID0gJCgnPGRpdiBpZD0iaHRtbF9mM2YzZDU3Yjc4YTc0NjViYjJlZjZjNzQ3NzRmZDIyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWxpY2U1OUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjZmNmQyN2QzZjA0NGYzOGU3ZmNmYzk5MzlmNTliZi5zZXRDb250ZW50KGh0bWxfZjNmM2Q1N2I3OGE3NDY1YmIyZWY2Yzc0Nzc0ZmQyMjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTY5YTcwM2I5OTU1NGZkMGJlNTA1NWY5MTBmNDM1NzEuYmluZFBvcHVwKHBvcHVwXzA2NmY2ZDI3ZDNmMDQ0ZjM4ZTdmY2ZjOTkzOWY1OWJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlN2E3NTY5NGQxNTRmZjQ5OTViYWFmMzY4YzZmYWE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwOTIxOCw4LjUwMTY3NDIwMDg3OTMwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTkzOWZlM2M4YzY0YjJiYTlmOTFlMjhkZDc2ZWRmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODNjY2I0OTE5NTY0ZWZkOWI0ZDU3ZDkwMjZmNDI2MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDgzY2NiNDkxOTU2NGVmZDliNGQ1N2Q5MDI2ZjQyNjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmF1Z3VzdGFzdGFockBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjE5MzlmZTNjOGM2NGIyYmE5ZjkxZTI4ZGQ3NmVkZjguc2V0Q29udGVudChodG1sXzA4M2NjYjQ5MTk1NjRlZmQ5YjRkNTdkOTAyNmY0MjYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlN2E3NTY5NGQxNTRmZjQ5OTViYWFmMzY4YzZmYWE0LmJpbmRQb3B1cChwb3B1cF9mMTkzOWZlM2M4YzY0YjJiYTlmOTFlMjhkZDc2ZWRmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjEyYjJhZDRmYmE0MjUwYmU0MmY5YTQyZjY2MzEzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2NzM0YzU3MDI2NDRmYTg4Y2FkYWM5OWQ3NTcwYmJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllMTNhOTFkZjgzYjQ0NWFiYzQ0ZGI3MjRlOTJjODgxID0gJCgnPGRpdiBpZD0iaHRtbF85ZTEzYTkxZGY4M2I0NDVhYmM0NGRiNzI0ZTkyYzg4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZGl0c2NobGVyaW5tZWhkaUBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY3MzRjNTcwMjY0NGZhODhjYWRhYzk5ZDc1NzBiYmEuc2V0Q29udGVudChodG1sXzllMTNhOTFkZjgzYjQ0NWFiYzQ0ZGI3MjRlOTJjODgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyMTJiMmFkNGZiYTQyNTBiZTQyZjlhNDJmNjYzMTM0LmJpbmRQb3B1cChwb3B1cF8xNjczNGM1NzAyNjQ0ZmE4OGNhZGFjOTlkNzU3MGJiYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjJmNmRjYzFmMjI0ZTA5YTgyNmE3NDk2N2VlMmQ0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDE2OTIsOC40OTQyNzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzViYzRhMDMzOWRkYTQ0N2ZhZmE4MGE3NTg5ODk2OTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmZTM4ZTEwZjZmYTQzYTRhNzYzZjUzOGIxZjg4MjRhID0gJCgnPGRpdiBpZD0iaHRtbF9hZmUzOGUxMGY2ZmE0M2E0YTc2M2Y1MzhiMWY4ODI0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cXJpZWhsQHNlaWRlbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzViYzRhMDMzOWRkYTQ0N2ZhZmE4MGE3NTg5ODk2OTM3LnNldENvbnRlbnQoaHRtbF9hZmUzOGUxMGY2ZmE0M2E0YTc2M2Y1MzhiMWY4ODI0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYjJmNmRjYzFmMjI0ZTA5YTgyNmE3NDk2N2VlMmQ0ZC5iaW5kUG9wdXAocG9wdXBfNWJjNGEwMzM5ZGRhNDQ3ZmFmYTgwYTc1ODk4OTY5MzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjIyODczYTc2OGZhNGE0ZDg5NjhmNGI3MzQ2ZDJmNjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTgyNDQzLDguNTA4MjQ2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjgwZTRhYThlMGE0OTQ3YmY2NjkxMWZkNDY4ODRiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMDMyZWViYTA2NDI0NTVkYmE0ZmI1ZjJkNGVkZDFjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzAzMmVlYmEwNjQyNDU1ZGJhNGZiNWYyZDRlZGQxY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJhcnRoa2xhdWRpYUB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2ODBlNGFhOGUwYTQ5NDdiZjY2OTExZmQ0Njg4NGJiLnNldENvbnRlbnQoaHRtbF8zMDMyZWViYTA2NDI0NTVkYmE0ZmI1ZjJkNGVkZDFjYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjI4NzNhNzY4ZmE0YTRkODk2OGY0YjczNDZkMmY2NS5iaW5kUG9wdXAocG9wdXBfMzY4MGU0YWE4ZTBhNDk0N2JmNjY5MTFmZDQ2ODg0YmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTEwM2I3ZTFiZDc0NDQ0N2JhOWY4YWIyMTVmZGM0OWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDA4NDM3NSw4LjQ5OTMyMDgzOTI5NDQwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZDVjYjgxNDcxZDQ0MmM3OTAyZTBlYjkwYWNmMjVmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzBlMjY2NmZiY2M0MjhkOTk2MzkxNTFhM2FkMmM1MyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzMwZTI2NjZmYmNjNDI4ZDk5NjM5MTUxYTNhZDJjNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtyZWluYmVydGFAcGFlcnR6ZWx0Lm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWQ1Y2I4MTQ3MWQ0NDJjNzkwMmUwZWI5MGFjZjI1ZjIuc2V0Q29udGVudChodG1sX2MzMGUyNjY2ZmJjYzQyOGQ5OTYzOTE1MWEzYWQyYzUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkxMDNiN2UxYmQ3NDQ0NDdiYTlmOGFiMjE1ZmRjNDllLmJpbmRQb3B1cChwb3B1cF85ZDVjYjgxNDcxZDQ0MmM3OTAyZTBlYjkwYWNmMjVmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jM2I1MDI2MDk4NTk0ZGM5YTY4NDJkYzYxNjRhYzU0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjQ2NjU1LDguNTEwMzg4Nzk1NjM3OTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmMGZiNGY5NzJiMzRiYmRiMDY3YjJiNmUzMDM1Y2Y0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwNjIwNjE3NzExZDQ5M2Y4ZDgwNjE5MDNjOGYwZmJlID0gJCgnPGRpdiBpZD0iaHRtbF80MDYyMDYxNzcxMWQ0OTNmOGQ4MDYxOTAzYzhmMGZiZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bmljb2xlYmFydGhAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmMGZiNGY5NzJiMzRiYmRiMDY3YjJiNmUzMDM1Y2Y0LnNldENvbnRlbnQoaHRtbF80MDYyMDYxNzcxMWQ0OTNmOGQ4MDYxOTAzYzhmMGZiZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jM2I1MDI2MDk4NTk0ZGM5YTY4NDJkYzYxNjRhYzU0ZC5iaW5kUG9wdXAocG9wdXBfM2YwZmI0Zjk3MmIzNGJiZGIwNjdiMmI2ZTMwMzVjZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzExMmJkYzk4NWU2NGNjNTgxNTAxZTczMWQ4M2Q4MGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg1ODMyMDAwMDAwMDQsOC41MDQxMjk4MDMwMzAxOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzU3ZjdkNWFjNDk5NDllNzg4MjRmMzRlYzA2OTcxNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDdiODVhNjNkNjQ0NGJiNWJkZGUwY2IzODlhMzcyNTMgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3Yjg1YTYzZDY0NDRiYjViZGRlMGNiMzg5YTM3MjUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ua2FsbGVydEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzU3ZjdkNWFjNDk5NDllNzg4MjRmMzRlYzA2OTcxNzQuc2V0Q29udGVudChodG1sX2Q3Yjg1YTYzZDY0NDRiYjViZGRlMGNiMzg5YTM3MjUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxMTJiZGM5ODVlNjRjYzU4MTUwMWU3MzFkODNkODBmLmJpbmRQb3B1cChwb3B1cF83NTdmN2Q1YWM0OTk0OWU3ODgyNGYzNGVjMDY5NzE3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MWU4MmFiYzFhZmQ0MGY5YmVjODUxOWE3M2JmMDlhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDA3NDg1LDguNTA0NTg5OTA4ODM2NzM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjZmQ2MDJhMzJiNTRkMzlhOTY3MjA2MWI1MmZlYTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0ZDZhM2Q5YTJiMzQ2ZTg5NDkzNWQxNDQ4Y2JmMTZlID0gJCgnPGRpdiBpZD0iaHRtbF8xNGQ2YTNkOWEyYjM0NmU4OTQ5MzVkMTQ0OGNiZjE2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YmlyZ2l0dDUxQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjZmQ2MDJhMzJiNTRkMzlhOTY3MjA2MWI1MmZlYTFhLnNldENvbnRlbnQoaHRtbF8xNGQ2YTNkOWEyYjM0NmU4OTQ5MzVkMTQ0OGNiZjE2ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MWU4MmFiYzFhZmQ0MGY5YmVjODUxOWE3M2JmMDlhMC5iaW5kUG9wdXAocG9wdXBfM2NmZDYwMmEzMmI1NGQzOWE5NjcyMDYxYjUyZmVhMWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjM0NTQ0NWYyMTI4NGQxNTkwYzgxYWZlMTNlOThhZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY1NDU4LDguNTA2NjY4NDA5MDc2NjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzOTI4MDMyMjRmODQyYTZiZGE3NGEwODhkZjQwMWJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5YzUyNzdjM2JjYzQ0YzU5OWVjNjhjOWI1NmJhYjU2ID0gJCgnPGRpdiBpZD0iaHRtbF83OWM1Mjc3YzNiY2M0NGM1OTllYzY4YzliNTZiYWI1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cGhvbHRAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzOTI4MDMyMjRmODQyYTZiZGE3NGEwODhkZjQwMWJiLnNldENvbnRlbnQoaHRtbF83OWM1Mjc3YzNiY2M0NGM1OTllYzY4YzliNTZiYWI1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MzQ1NDQ1ZjIxMjg0ZDE1OTBjODFhZmUxM2U5OGFmZi5iaW5kUG9wdXAocG9wdXBfNDM5MjgwMzIyNGY4NDJhNmJkYTc0YTA4OGRmNDAxYmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjNkOWM1Y2Y3ZTg3NDI4NGI1NjFmYzYwOTUyNzFjNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTQ4MDM2NDk5OTk5OTYsOC40ODAwMzI2MTgwMDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjNzU0NGIwZTkxZDQ1ZjliN2RhZjQwNDFkY2U3MWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkZDVkMDdiYmJkYzQwODM4NmRjNThiZTM0MDkyNjFlID0gJCgnPGRpdiBpZD0iaHRtbF81ZGQ1ZDA3YmJiZGM0MDgzODZkYzU4YmUzNDA5MjYxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGF1c3Rlcm11ZWhsZUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdjNzU0NGIwZTkxZDQ1ZjliN2RhZjQwNDFkY2U3MWE1LnNldENvbnRlbnQoaHRtbF81ZGQ1ZDA3YmJiZGM0MDgzODZkYzU4YmUzNDA5MjYxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iM2Q5YzVjZjdlODc0Mjg0YjU2MWZjNjA5NTI3MWM0NS5iaW5kUG9wdXAocG9wdXBfN2M3NTQ0YjBlOTFkNDVmOWI3ZGFmNDA0MWRjZTcxYTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWRkYzhkMmMzYzA1NGRlMmI4YzQ0NjBjYzE1MjAwZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTI5NzI4LDguNDgxMjU4MzY1MDUxNDU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjZTMyZDg3Y2FjZjQyNWE4Y2FhNTc0MDY2MGNlYjBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3Zjg1OGEwMDUyMzQzZTg5ZmQzZmQxYTU5MjYwZTk1ID0gJCgnPGRpdiBpZD0iaHRtbF9lN2Y4NThhMDA1MjM0M2U4OWZkM2ZkMWE1OTI2MGU5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bW9uamExNUBzY2hhZWZlci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWNlMzJkODdjYWNmNDI1YThjYWE1NzQwNjYwY2ViMGQuc2V0Q29udGVudChodG1sX2U3Zjg1OGEwMDUyMzQzZTg5ZmQzZmQxYTU5MjYwZTk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkZGM4ZDJjM2MwNTRkZTJiOGM0NDYwY2MxNTIwMGVlLmJpbmRQb3B1cChwb3B1cF81Y2UzMmQ4N2NhY2Y0MjVhOGNhYTU3NDA2NjBjZWIwZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iY2I1ZjgwNmYyOTY0MTg0ODQ2YzMyNjNjNTgxYTZlZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NTkwNDgsOC41MTQzNzI0OTQwNTI4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZDlhNmI5NThkYTc0ZDVlODYzNzIwMTliNjk4MWQxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYmFjNjMyYjRjOTQ0YTY5YmVlNzJlYjc5YTEyZmJmNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmJhYzYzMmI0Yzk0NGE2OWJlZTcyZWI3OWExMmZiZjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0ZWluYmVyZ2plbm5pZmVyQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Q5YTZiOTU4ZGE3NGQ1ZTg2MzcyMDE5YjY5ODFkMWMuc2V0Q29udGVudChodG1sX2ZiYWM2MzJiNGM5NDRhNjliZWU3MmViNzlhMTJmYmY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjYjVmODA2ZjI5NjQxODQ4NDZjMzI2M2M1ODFhNmVlLmJpbmRQb3B1cChwb3B1cF9jZDlhNmI5NThkYTc0ZDVlODYzNzIwMTliNjk4MWQxYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTZiYjU3MGZlMzk0N2ZhYjEyZjdkZTg2NzI4NWY4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzA0MTA1MDAwMDAwNCw4LjQ4MzM3OTY0OTk4OTI2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NmJlNjNmYTc3ZmM0MzA2YmZmNGU5OWRhNmFkYWQwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NjM5NWMxZDJlNjA0MzE5YmQzZmIyYThhM2RkNGVjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDYzOTVjMWQyZTYwNDMxOWJkM2ZiMmE4YTNkZDRlY2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1laWtiZWllckB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTZiZTYzZmE3N2ZjNDMwNmJmZjRlOTlkYTZhZGFkMGYuc2V0Q29udGVudChodG1sXzQ2Mzk1YzFkMmU2MDQzMTliZDNmYjJhOGEzZGQ0ZWNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1NmJiNTcwZmUzOTQ3ZmFiMTJmN2RlODY3Mjg1Zjg3LmJpbmRQb3B1cChwb3B1cF85NmJlNjNmYTc3ZmM0MzA2YmZmNGU5OWRhNmFkYWQwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZmM3ZTk5MzE1OTE0MzRjODk3OGFjMTlkZjBlY2Y2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjc3Njc1MDAwMDAwNiw4LjQ5NDE1ODA0MjEyMjgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWFkYjI2Yjg2NDA0YTAxYjE5NTA0ZTRhOWJmMjUzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDM1Y2Y2MGIzZDY0YjhkOTA3NTcyNGQwNDNmZmQ4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTAzNWNmNjBiM2Q2NGI4ZDkwNzU3MjRkMDQzZmZkODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFzY2hvZW5sYW5kQG11ZWhsZS5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTVhZGIyNmI4NjQwNGEwMWIxOTUwNGU0YTliZjI1M2Uuc2V0Q29udGVudChodG1sXzEwMzVjZjYwYjNkNjRiOGQ5MDc1NzI0ZDA0M2ZmZDg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmYzdlOTkzMTU5MTQzNGM4OTc4YWMxOWRmMGVjZjYzLmJpbmRQb3B1cChwb3B1cF85NWFkYjI2Yjg2NDA0YTAxYjE5NTA0ZTRhOWJmMjUzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjVjMjk1MWYxZTE0NTRjOGZhNGY4ZWU2OWIwZmUyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjkxMzQ1LDguNTExODIxMDMzOTg3NDM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4NjU5ODI1ZWZlMTRmNTVhMWMyODY0ODBjMWEyY2JkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4MDJlYjRiNjQ4YjQxM2ZiMTYyNTA1YTU3ZDVmZDAxID0gJCgnPGRpdiBpZD0iaHRtbF83ODAyZWI0YjY0OGI0MTNmYjE2MjUwNWE1N2Q1ZmQwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aHVlYmVsZ2Vvcmdpb3NAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hODY1OTgyNWVmZTE0ZjU1YTFjMjg2NDgwYzFhMmNiZC5zZXRDb250ZW50KGh0bWxfNzgwMmViNGI2NDhiNDEzZmIxNjI1MDVhNTdkNWZkMDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDI1YzI5NTFmMWUxNDU0YzhmYTRmOGVlNjliMGZlMmYuYmluZFBvcHVwKHBvcHVwX2E4NjU5ODI1ZWZlMTRmNTVhMWMyODY0ODBjMWEyY2JkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJhZDk3OTllNThmYzQzMDFiZTQzMzVmMGIxZjc2ZThkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MDYyMDUsOC41MDE0ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2NWFhNWU4NjE4NDQ5MTY4NDFkYjg5ZjJlM2UwNTgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlODk1NDNmMmVjYTQ4MWNhMDA5M2FmOGE3MjMzZDY5ID0gJCgnPGRpdiBpZD0iaHRtbF9mZTg5NTQzZjJlY2E0ODFjYTAwOTNhZjhhNzIzM2Q2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a2FldGhpc3RvbGxAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjVhYTVlODYxODQ0OTE2ODQxZGI4OWYyZTNlMDU4My5zZXRDb250ZW50KGh0bWxfZmU4OTU0M2YyZWNhNDgxY2EwMDkzYWY4YTcyMzNkNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmFkOTc5OWU1OGZjNDMwMWJlNDMzNWYwYjFmNzZlOGQuYmluZFBvcHVwKHBvcHVwXzA2NWFhNWU4NjE4NDQ5MTY4NDFkYjg5ZjJlM2UwNTgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzM2E1MGZkMThiZjQ1ZWRiZjIxOGI0MmIzYmZjOGJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5NjA5LDguNTA4MDE1NjYzMTMzOTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1MzUyNzE2MTI4MTQxMzRiNDI5NjYzOTBmMmExZWI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1NDUzY2I4ZjEyYjRmYTZiMGE5MzQ0MGViMmNmYzU0ID0gJCgnPGRpdiBpZD0iaHRtbF81NTQ1M2NiOGYxMmI0ZmE2YjBhOTM0NDBlYjJjZmM1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+anNjaHVjaGhhcmR0QHdpZWxvY2guZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1MzUyNzE2MTI4MTQxMzRiNDI5NjYzOTBmMmExZWI5LnNldENvbnRlbnQoaHRtbF81NTQ1M2NiOGYxMmI0ZmE2YjBhOTM0NDBlYjJjZmM1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzNhNTBmZDE4YmY0NWVkYmYyMThiNDJiM2JmYzhiZS5iaW5kUG9wdXAocG9wdXBfMzUzNTI3MTYxMjgxNDEzNGI0Mjk2NjM5MGYyYTFlYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmY2MWQ5ZWUxMDllNGZmMmI2ODc1MTg3MzFhMTE2YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTE1OTIyOTk5OTk5OTUsOC40ODU1Nzg3MjY0Mzc2NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNiYzAxYTE1NTM5NDNkN2E1NWZjMGM4NTg1OTY2MzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWI0OTkxNjRlMDY4NDY2N2I2Y2YwMTY3ZTUzZDUzYTEgPSAkKCc8ZGl2IGlkPSJodG1sX2ViNDk5MTY0ZTA2ODQ2NjdiNmNmMDE2N2U1M2Q1M2ExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sZW9uNzBAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzYmMwMWExNTUzOTQzZDdhNTVmYzBjODU4NTk2NjM5LnNldENvbnRlbnQoaHRtbF9lYjQ5OTE2NGUwNjg0NjY3YjZjZjAxNjdlNTNkNTNhMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZjYxZDllZTEwOWU0ZmYyYjY4NzUxODczMWExMTZhNi5iaW5kUG9wdXAocG9wdXBfYjNiYzAxYTE1NTM5NDNkN2E1NWZjMGM4NTg1OTY2MzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDc2ZTg4YzFmN2YyNDgwNzhhZGIzYzQ4ZWY3NTBhM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTE1OTIyOTk5OTk5OTUsOC40ODU1Nzg3MjY0Mzc2NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDc0MTUzYjI1OGI1NDY0NDk1ZjgxYTkzMWRlMGYxNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzdiODcxMDU1MzU4NDIwMjlkZDdhZjIzYjNkYTM2NTEgPSAkKCc8ZGl2IGlkPSJodG1sXzM3Yjg3MTA1NTM1ODQyMDI5ZGQ3YWYyM2IzZGEzNjUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5nb3R0aGFyZDY0QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDc0MTUzYjI1OGI1NDY0NDk1ZjgxYTkzMWRlMGYxNWIuc2V0Q29udGVudChodG1sXzM3Yjg3MTA1NTM1ODQyMDI5ZGQ3YWYyM2IzZGEzNjUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3NmU4OGMxZjdmMjQ4MDc4YWRiM2M0OGVmNzUwYTNlLmJpbmRQb3B1cChwb3B1cF80NzQxNTNiMjU4YjU0NjQ0OTVmODFhOTMxZGUwZjE1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MTY4YTA2NzcwZGU0OTRiOGQ1ZWM5ZDUzNDAyNWIzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTM5OTQ1LDguNTAwMzE2NzIzNDE3OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGZlMWU5NzAzMzE2NDQxYzkwODExZTc1OWFmOWZlMmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDUwZGQzZDNjMDIzNDQ4MmJmYWExNzZmNWFjZDQ5YzUgPSAkKCc8ZGl2IGlkPSJodG1sXzA1MGRkM2QzYzAyMzQ0ODJiZmFhMTc2ZjVhY2Q0OWM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij52emlybWVAdGx1c3Rlay5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGZlMWU5NzAzMzE2NDQxYzkwODExZTc1OWFmOWZlMmQuc2V0Q29udGVudChodG1sXzA1MGRkM2QzYzAyMzQ0ODJiZmFhMTc2ZjVhY2Q0OWM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkxNjhhMDY3NzBkZTQ5NGI4ZDVlYzlkNTM0MDI1YjMxLmJpbmRQb3B1cChwb3B1cF8wZmUxZTk3MDMzMTY0NDFjOTA4MTFlNzU5YWY5ZmUyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MzM3OTJkODFkYjE0MDBhODlkZGYwMTYxOGM4ZjMwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTQ5NTgsOC40ODQ1NjgyNDYzMTMwNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTVkNTc4NzJjOTMzNDYxYmE3MDk3YTJlMDFlMzVjNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDU5YWE0OTliNzY4NDMwYTg3MTJlNmNjZDFmZGIxNDAgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1OWFhNDk5Yjc2ODQzMGE4NzEyZTZjY2QxZmRiMTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56a3VobEBtaWVzLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTVkNTc4NzJjOTMzNDYxYmE3MDk3YTJlMDFlMzVjNTYuc2V0Q29udGVudChodG1sX2Q1OWFhNDk5Yjc2ODQzMGE4NzEyZTZjY2QxZmRiMTQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczMzc5MmQ4MWRiMTQwMGE4OWRkZjAxNjE4YzhmMzAwLmJpbmRQb3B1cChwb3B1cF85NWQ1Nzg3MmM5MzM0NjFiYTcwOTdhMmUwMWUzNWM1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDA3ZWZmYzdiOTI0ZWQ5ODc1OTNkN2FiZmQ2Nzg5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTM2OTI1LDguNTA4Nzg3MjcyMTAwMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg4MWFiMzM0MGE3NDU1YjljNjQ3Y2I0YWNhMzlhYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmVhYThlNzEyNjViNDhkNjkwMmMzMzZhNjJlMjhiOGIgPSAkKCc8ZGl2IGlkPSJodG1sX2ZlYWE4ZTcxMjY1YjQ4ZDY5MDJjMzM2YTYyZTI4YjhiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oZXlkcmljaGFudG9uQGVobGVydC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg4MWFiMzM0MGE3NDU1YjljNjQ3Y2I0YWNhMzlhYjEuc2V0Q29udGVudChodG1sX2ZlYWE4ZTcxMjY1YjQ4ZDY5MDJjMzM2YTYyZTI4YjhiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwMDdlZmZjN2I5MjRlZDk4NzU5M2Q3YWJmZDY3ODk1LmJpbmRQb3B1cChwb3B1cF9jODgxYWIzMzQwYTc0NTViOWM2NDdjYjRhY2EzOWFiMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Y2MxNDdhNWNlYzk0ZjM2OGFhMjYxMTY3M2FlYjYxMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTUyMTEsOC40OTkwNjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmNmQyYzk5ZDM5ODQxYzc5MmE5MWU3Nzc0Yjg3ODAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4OTY0ZDk2OTg4ZDRlM2RiMjZiZDJjNjNlNmUwYWM0ID0gJCgnPGRpdiBpZD0iaHRtbF9lODk2NGQ5Njk4OGQ0ZTNkYjI2YmQyYzYzZTZlMGFjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZHJ1YmlubWFyY2VsbGFAcnVwcGVydC5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmNmQyYzk5ZDM5ODQxYzc5MmE5MWU3Nzc0Yjg3ODAxLnNldENvbnRlbnQoaHRtbF9lODk2NGQ5Njk4OGQ0ZTNkYjI2YmQyYzYzZTZlMGFjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Y2MxNDdhNWNlYzk0ZjM2OGFhMjYxMTY3M2FlYjYxMi5iaW5kUG9wdXAocG9wdXBfZmY2ZDJjOTlkMzk4NDFjNzkyYTkxZTc3NzRiODc4MDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGMzM2QyZGY3ZTFkNGRiMjg2NWRmMmY3Y2E1ZmY5ZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTc2OTczMDAwMDAwMDQsOC41MDcxNDk3MDAwMDAwMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2Y4NGYxYTFmYzIxNDhkYTk5MGE0NDQ2Zjg1MzE2M2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTlmOGVlNTE3YmUzNDZiYzk5MWY2YjUzZmU4NzY4ZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2E5ZjhlZTUxN2JlMzQ2YmM5OTFmNmI1M2ZlODc2OGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij55ZXR6b2xkQGhpbGxlci5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmODRmMWExZmMyMTQ4ZGE5OTBhNDQ0NmY4NTMxNjNiLnNldENvbnRlbnQoaHRtbF9hOWY4ZWU1MTdiZTM0NmJjOTkxZjZiNTNmZTg3NjhlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYzMzZDJkZjdlMWQ0ZGIyODY1ZGYyZjdjYTVmZjllNi5iaW5kUG9wdXAocG9wdXBfM2Y4NGYxYTFmYzIxNDhkYTk5MGE0NDQ2Zjg1MzE2M2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQzMDNkNTFjNTRjNDA5MThlMDY5NWUwODk4ODNmYTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY1NDU4LDguNTA2NjY4NDA5MDc2NjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxN2Y3N2I1MmU5ZDQzNjQ4MjYxYjg3NzBmYWNjYzE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiZWYxZjkyM2ZhYTRiNzI5YjdhYzg5M2JmZGQyMjdmID0gJCgnPGRpdiBpZD0iaHRtbF8zYmVmMWY5MjNmYWE0YjcyOWI3YWM4OTNiZmRkMjI3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z29yYW41N0BnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxN2Y3N2I1MmU5ZDQzNjQ4MjYxYjg3NzBmYWNjYzE3LnNldENvbnRlbnQoaHRtbF8zYmVmMWY5MjNmYWE0YjcyOWI3YWM4OTNiZmRkMjI3Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZDMwM2Q1MWM1NGM0MDkxOGUwNjk1ZTA4OTg4M2ZhNy5iaW5kUG9wdXAocG9wdXBfYjE3Zjc3YjUyZTlkNDM2NDgyNjFiODc3MGZhY2NjMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjg4YzlhMzM3MGIzNDlkNjk0MmYyMTc1MGMyMzhmNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY1OTAyNSw4LjQ5MjQ2MzU0NjMyOTI4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzhkZmNiZmY2M2Q0ZTBhYTNlYzgzMWM2ZTUzZjk0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjBhMzdiYjA1OTA0MWI3YWQwOWFiZjk3YTQ1MGVlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODIwYTM3YmIwNTkwNDFiN2FkMDlhYmY5N2E0NTBlZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtsYXVkaWFoYXJ0bWFubkBndXRrbmVjaHQuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzhkZmNiZmY2M2Q0ZTBhYTNlYzgzMWM2ZTUzZjk0MS5zZXRDb250ZW50KGh0bWxfODIwYTM3YmIwNTkwNDFiN2FkMDlhYmY5N2E0NTBlZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjg4YzlhMzM3MGIzNDlkNjk0MmYyMTc1MGMyMzhmNmQuYmluZFBvcHVwKHBvcHVwXzMzOGRmY2JmZjYzZDRlMGFhM2VjODMxYzZlNTNmOTQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViYTYzYjM3YzZhODQ2NmJiNWVmY2E0MmUzMWEwZDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NTE1NzUsOC41MDgzNjI5NzA5NTc3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZmMyOGM4MWQxYWM0ZGMxOGVjMWVlMWNlNjdiZGNhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OTY5NWVkMThiNzA0YTViYWRlMTE3NWQ0MzlmZmMwMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTk2OTVlZDE4YjcwNGE1YmFkZTExNzVkNDM5ZmZjMDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmthZXN0ZXJoZWxnYUB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGZjMjhjODFkMWFjNGRjMThlYzFlZTFjZTY3YmRjYWUuc2V0Q29udGVudChodG1sXzU5Njk1ZWQxOGI3MDRhNWJhZGUxMTc1ZDQzOWZmYzAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViYTYzYjM3YzZhODQ2NmJiNWVmY2E0MmUzMWEwZDViLmJpbmRQb3B1cChwb3B1cF9kZmMyOGM4MWQxYWM0ZGMxOGVjMWVlMWNlNjdiZGNhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NzdmYjZmZGVmZDg0Zjk1YmU0ZTQ1MmRiZmJmM2ZkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2E4N2IzNDlmNTI0NDllZDlkMDA1Zjk1ZDkwN2IyMDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTg1MzVmZmQ3NGFlNGUxMTk0ODI1YTA0NTUxNDIyMzQgPSAkKCc8ZGl2IGlkPSJodG1sXzk4NTM1ZmZkNzRhZTRlMTE5NDgyNWEwNDU1MTQyMjM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdG9sbHN0amVwYW5AdWxscmljaC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2E4N2IzNDlmNTI0NDllZDlkMDA1Zjk1ZDkwN2IyMDUuc2V0Q29udGVudChodG1sXzk4NTM1ZmZkNzRhZTRlMTE5NDgyNWEwNDU1MTQyMjM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3N2ZiNmZkZWZkODRmOTViZTRlNDUyZGJmYmYzZmQ4LmJpbmRQb3B1cChwb3B1cF83YTg3YjM0OWY1MjQ0OWVkOWQwMDVmOTVkOTA3YjIwNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NjMyNzMxYWJiMWE0M2I1ODFmZTQ2YzAwYjU4MjVkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjQxMTMsOC40OTc2Mjg1MDk5NzgxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjk3YjIyODA1NTY1NGQ5ZDg0MGMwZmVlNWM1ODQ1NmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmMyOGEzZGU2NzM4NGRmZTk5ZWI0MzRlZTUzYjRhZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2JjMjhhM2RlNjczODRkZmU5OWViNDM0ZWU1M2I0YWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hbGV4ZWlob2xzdGVuQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjk3YjIyODA1NTY1NGQ5ZDg0MGMwZmVlNWM1ODQ1NmYuc2V0Q29udGVudChodG1sX2JjMjhhM2RlNjczODRkZmU5OWViNDM0ZWU1M2I0YWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2MzI3MzFhYmIxYTQzYjU4MWZlNDZjMDBiNTgyNWQ3LmJpbmRQb3B1cChwb3B1cF82OTdiMjI4MDU1NjU0ZDlkODQwYzBmZWU1YzU4NDU2Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZDBlODc0MDNkYzE0M2QzYWRjYjJkODRmZmU0NGIyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNDQ3NjI1LDguNDc5NTQ2MTMwMTY5Njg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0ZmM3YTQyZjc5MjRkNzg4ZjZlN2EyMGRjZjQ5OWNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI0OWJiZjM2MGQwODRhMDJhYzRkM2U1YjlmOGIwMDgwID0gJCgnPGRpdiBpZD0iaHRtbF8yNDliYmYzNjBkMDg0YTAyYWM0ZDNlNWI5ZjhiMDA4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3BldWtlcnRAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNGZjN2E0MmY3OTI0ZDc4OGY2ZTdhMjBkY2Y0OTljZi5zZXRDb250ZW50KGh0bWxfMjQ5YmJmMzYwZDA4NGEwMmFjNGQzZTViOWY4YjAwODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmQwZTg3NDAzZGMxNDNkM2FkY2IyZDg0ZmZlNDRiMmEuYmluZFBvcHVwKHBvcHVwXzE0ZmM3YTQyZjc5MjRkNzg4ZjZlN2EyMGRjZjQ5OWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzYmQ5OTVhOGFjMjRkZjA4MDg5ZDdkMGMzNjViNjQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2ODQ0MDUwMDAwMDA0LDguNDc4ODEyOTExNDU1OTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0YTM5MzU1MjlhNzQwYjg5ZjhlYzZiYjhkZmRlMjVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3NmZkYmZkY2IyYzQ0MmViZTM1YTQ0NGU4YmQyYTdjID0gJCgnPGRpdiBpZD0iaHRtbF84NzZmZGJmZGNiMmM0NDJlYmUzNWE0NDRlOGJkMmE3YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2Vvcmdpb3NzY2hsZWljaEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0YTM5MzU1MjlhNzQwYjg5ZjhlYzZiYjhkZmRlMjVmLnNldENvbnRlbnQoaHRtbF84NzZmZGJmZGNiMmM0NDJlYmUzNWE0NDRlOGJkMmE3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lM2JkOTk1YThhYzI0ZGYwODA4OWQ3ZDBjMzY1YjY0Ny5iaW5kUG9wdXAocG9wdXBfMzRhMzkzNTUyOWE3NDBiODlmOGVjNmJiOGRmZGUyNWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjliNjNmMDU3MTZmNDNkMDg2ZWE4YjBjY2RlMWYwYTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTU4Mjc5LDguNDgxMDQyOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xY2UyZmY2MDgwM2Q0ZmQ0ODgwNWNiNTg4Y2IwODRmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNjY2MWM5YmUwMjE0YzJhODU5ZGMzY2E3ZmU3MDRmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDY2NjFjOWJlMDIxNGMyYTg1OWRjM2NhN2ZlNzA0ZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhhZXJpbmdhbGljZUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2UyZmY2MDgwM2Q0ZmQ0ODgwNWNiNTg4Y2IwODRmMi5zZXRDb250ZW50KGh0bWxfMDY2NjFjOWJlMDIxNGMyYTg1OWRjM2NhN2ZlNzA0ZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjliNjNmMDU3MTZmNDNkMDg2ZWE4YjBjY2RlMWYwYTAuYmluZFBvcHVwKHBvcHVwXzFjZTJmZjYwODAzZDRmZDQ4ODA1Y2I1ODhjYjA4NGYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiZmEzNGQyMTQ4NjRkMTlhY2U2ZmI3NDQyZjk1YmMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMDY2MzUsOC40OTI5MzIyNTEwNTg2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjU5NDdlOGM2MWUzNDkxZTgzNTJiNTA5ODc1YThiYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGJmNzMwYzM3YjNlNDJjMzkwMzMwMzQwMjBhMzZkNzMgPSAkKCc8ZGl2IGlkPSJodG1sX2RiZjczMGMzN2IzZTQyYzM5MDMzMDM0MDIwYTM2ZDczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tYXJpdXN6NTZAa3JlaW4uY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NTk0N2U4YzYxZTM0OTFlODM1MmI1MDk4NzVhOGJiNC5zZXRDb250ZW50KGh0bWxfZGJmNzMwYzM3YjNlNDJjMzkwMzMwMzQwMjBhMzZkNzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGJmYTM0ZDIxNDg2NGQxOWFjZTZmYjc0NDJmOTViYzMuYmluZFBvcHVwKHBvcHVwXzY1OTQ3ZThjNjFlMzQ5MWU4MzUyYjUwOTg3NWE4YmI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlNDFhMjBmNTJhNTQ4ZDJhNzE2NDZkYjk5NjhhODJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5NjcwMiw4LjUwMjM0NzM0ODI5NjYxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjU3YzE1YzU0ODk0Njc3OWZjNzBkZTc0ZTY3MGYyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTFjMTY3ZjkyNDQ0YzJlODkxNDk3OWExMTIyNDViNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTExYzE2N2Y5MjQ0NGMyZTg5MTQ5NzlhMTEyMjQ1YjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0ZXZlMzVAcGxhdGguY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjU3YzE1YzU0ODk0Njc3OWZjNzBkZTc0ZTY3MGYyZC5zZXRDb250ZW50KGh0bWxfZTExYzE2N2Y5MjQ0NGMyZTg5MTQ5NzlhMTEyMjQ1YjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGU0MWEyMGY1MmE1NDhkMmE3MTY0NmRiOTk2OGE4MmQuYmluZFBvcHVwKHBvcHVwXzg2NTdjMTVjNTQ4OTQ2Nzc5ZmM3MGRlNzRlNjcwZjJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmNjIyNTkwZjcwMTRlZGE5ZTI4OTQzYzMyYTVhNGM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMDI4NDUsOC41MDM5MzI3OTk2MjcxMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJiNzM3YWFjNWE0NGY4NjliYjIxYmE0OWFhNDJkMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDRlNGE3ZDY3ODRhNDI5MTk0YWEwNWU4ZGM3NDI4NWIgPSAkKCc8ZGl2IGlkPSJodG1sXzA0ZTRhN2Q2Nzg0YTQyOTE5NGFhMDVlOGRjNzQyODViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5xYmVuZGVyQHdlaXNzLm9yZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDJiNzM3YWFjNWE0NGY4NjliYjIxYmE0OWFhNDJkMDYuc2V0Q29udGVudChodG1sXzA0ZTRhN2Q2Nzg0YTQyOTE5NGFhMDVlOGRjNzQyODViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmNjIyNTkwZjcwMTRlZGE5ZTI4OTQzYzMyYTVhNGM3LmJpbmRQb3B1cChwb3B1cF9kMmI3MzdhYWM1YTQ0Zjg2OWJiMjFiYTQ5YWE0MmQwNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NTYyMGE5MWM1ZWQ0MjM3OWQ4M2NiODQwZjU3NGRjMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTIyMjA1LDguNDg0ODA2NDU3NjQ1MTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1YTMyMTdhMTE5NTQwYjA4ZGNlMDYxM2QyODQ2ZWVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjZWI5MDRkNzY2YTQ2NWI4ZDU0ZDRjZTdlODIxMzljID0gJCgnPGRpdiBpZD0iaHRtbF8zY2ViOTA0ZDc2NmE0NjViOGQ1NGQ0Y2U3ZTgyMTM5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZWhyZW5mcmllZDI4QGhvbHQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1YTMyMTdhMTE5NTQwYjA4ZGNlMDYxM2QyODQ2ZWVjLnNldENvbnRlbnQoaHRtbF8zY2ViOTA0ZDc2NmE0NjViOGQ1NGQ0Y2U3ZTgyMTM5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NTYyMGE5MWM1ZWQ0MjM3OWQ4M2NiODQwZjU3NGRjMy5iaW5kUG9wdXAocG9wdXBfNDVhMzIxN2ExMTk1NDBiMDhkY2UwNjEzZDI4NDZlZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzA5NGU5NDRmZDVlNGEzNzkxNjNhM2ZiM2VlNzgxYWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY4NDQwNTAwMDAwMDQsOC40Nzg4MTI5MTE0NTU5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjJkMTMzZmVkYTJlNGQyNzg1ZjNlNDQ2YWM1Y2I4NzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VlZmQyYzk1MDRmNGE2YjllNDAzOTkzOGQ1NTFiZGMgPSAkKCc8ZGl2IGlkPSJodG1sXzdlZWZkMmM5NTA0ZjRhNmI5ZTQwMzk5MzhkNTUxYmRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5saWRpYTA4QGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjJkMTMzZmVkYTJlNGQyNzg1ZjNlNDQ2YWM1Y2I4NzYuc2V0Q29udGVudChodG1sXzdlZWZkMmM5NTA0ZjRhNmI5ZTQwMzk5MzhkNTUxYmRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwOTRlOTQ0ZmQ1ZTRhMzc5MTYzYTNmYjNlZTc4MWFkLmJpbmRQb3B1cChwb3B1cF9mMmQxMzNmZWRhMmU0ZDI3ODVmM2U0NDZhYzVjYjg3Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MTUwMWUzZmI4ZDU0ZTA3YTk0ZjM5ZDFmY2UyMjVkZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWIyY2YxYjQ0NDBiNDNhZTgxYjk1Y2I3NmZiZGMwMTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzc1OGI0ZWMyYjcxNDgyOWE2OTA1YTQzZmVjNTkxMDQgPSAkKCc8ZGl2IGlkPSJodG1sXzc3NThiNGVjMmI3MTQ4MjlhNjkwNWE0M2ZlYzU5MTA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij50cmF1dGU0NUBoZXNzZS5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzViMmNmMWI0NDQwYjQzYWU4MWI5NWNiNzZmYmRjMDE3LnNldENvbnRlbnQoaHRtbF83NzU4YjRlYzJiNzE0ODI5YTY5MDVhNDNmZWM1OTEwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTUwMWUzZmI4ZDU0ZTA3YTk0ZjM5ZDFmY2UyMjVkZi5iaW5kUG9wdXAocG9wdXBfNWIyY2YxYjQ0NDBiNDNhZTgxYjk1Y2I3NmZiZGMwMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTBmMzA0ODUzOWNlNGNjNmE5YzVjYzQ2MTgwODU2M2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTc1NTA5NDk5OTk5OTYsOC41MTI5NDA0ODU5NzQyMDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTY1N2Y1MDk2ODRjNGYzNGFlNDBkZjBhN2VlODIzMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjg1Zjg5M2Y1OGZhNDk3MmE5YzRlZjMzNjFiNWU3ODQgPSAkKCc8ZGl2IGlkPSJodG1sX2I4NWY4OTNmNThmYTQ5NzJhOWM0ZWYzMzYxYjVlNzg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGFocmhpbGRlQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTY1N2Y1MDk2ODRjNGYzNGFlNDBkZjBhN2VlODIzMjEuc2V0Q29udGVudChodG1sX2I4NWY4OTNmNThmYTQ5NzJhOWM0ZWYzMzYxYjVlNzg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEwZjMwNDg1MzljZTRjYzZhOWM1Y2M0NjE4MDg1NjNmLmJpbmRQb3B1cChwb3B1cF85NjU3ZjUwOTY4NGM0ZjM0YWU0MGRmMGE3ZWU4MjMyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZjE0ZjM4NjZlMjQ0MGM1YTRkZjk1ZmQzOTczMmQ5ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDA0OSw4LjUwMDc2MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTU1MTZiZDIzYTBlNGYxMDkzM2Y1MmFjMzQxNjM4ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODI0YjQ3N2Y3MzhjNGY0YTk4OTFjYWI5Zjc4NDg2ZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzgyNGI0NzdmNzM4YzRmNGE5ODkxY2FiOWY3ODQ4NmY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53YWxseTczQGhleWRyaWNoLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU1MTZiZDIzYTBlNGYxMDkzM2Y1MmFjMzQxNjM4ZWIuc2V0Q29udGVudChodG1sXzgyNGI0NzdmNzM4YzRmNGE5ODkxY2FiOWY3ODQ4NmY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmMTRmMzg2NmUyNDQwYzVhNGRmOTVmZDM5NzMyZDllLmJpbmRQb3B1cChwb3B1cF8xNTUxNmJkMjNhMGU0ZjEwOTMzZjUyYWMzNDE2MzhlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMzcyNTQ2ZTVmNzg0NDAxYWIyOWMwYTc4ODlhYjIzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzU3MjksOC40OTg2MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjMjM1NTMyMTNiYTQ1YzQ4MzAxYjdiNDI0N2RkYjU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0YjliMTc5MmQwOTQ3YjA4MWNhN2E4Mjg4MTQzYjU5ID0gJCgnPGRpdiBpZD0iaHRtbF9iNGI5YjE3OTJkMDk0N2IwODFjYTdhODI4ODE0M2I1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+enJvZ2dlQGthcnouY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YzIzNTUzMjEzYmE0NWM0ODMwMWI3YjQyNDdkZGI1Ni5zZXRDb250ZW50KGh0bWxfYjRiOWIxNzkyZDA5NDdiMDgxY2E3YTgyODgxNDNiNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjM3MjU0NmU1Zjc4NDQwMWFiMjljMGE3ODg5YWIyM2MuYmluZFBvcHVwKHBvcHVwXzVjMjM1NTMyMTNiYTQ1YzQ4MzAxYjdiNDI0N2RkYjU2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4YTc0YTNkY2FhNzQwMmM5Mzk2ZWMxYWYxNDY3MmM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5OTI2OSw4LjQ4MjE1NjIwMTM2NjExM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZGQ3MzEzZTE0OTg0ZjFhYjQyMGFkNjYyYjllN2VmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZTFlZGU1OTY4ZWY0Y2ZiYjRjOGFjMDhjOGIwZTkxNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWUxZWRlNTk2OGVmNGNmYmI0YzhhYzA4YzhiMGU5MTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmlybWFzY2hlaWJlQHNjaHdpdGFsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRkNzMxM2UxNDk4NGYxYWI0MjBhZDY2MmI5ZTdlZmYuc2V0Q29udGVudChodG1sXzFlMWVkZTU5NjhlZjRjZmJiNGM4YWMwOGM4YjBlOTE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg4YTc0YTNkY2FhNzQwMmM5Mzk2ZWMxYWYxNDY3MmM3LmJpbmRQb3B1cChwb3B1cF82ZGQ3MzEzZTE0OTg0ZjFhYjQyMGFkNjYyYjllN2VmZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTI0NmI2YWI4YzE0Yzc4OGYyN2VjYzQwNjk2ZGVhYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZiMDNkMWVkYWNmNDZjMjgwY2QwY2Y4MjI5NThhZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjkzMDZhYmQ2YTYxNDA3OGIwMTk1N2ZhNWNmYWMyODIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5MzA2YWJkNmE2MTQwNzhiMDE5NTdmYTVjZmFjMjgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56b3JiYWNoa2FybC1mcmllZHJpY2hAdGx1c3Rlay5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjZiMDNkMWVkYWNmNDZjMjgwY2QwY2Y4MjI5NThhZjcuc2V0Q29udGVudChodG1sX2Y5MzA2YWJkNmE2MTQwNzhiMDE5NTdmYTVjZmFjMjgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5MjQ2YjZhYjhjMTRjNzg4ZjI3ZWNjNDA2OTZkZWFhLmJpbmRQb3B1cChwb3B1cF9iNmIwM2QxZWRhY2Y0NmMyODBjZDBjZjgyMjk1OGFmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OGI1OGVkNjIzMzg0ODlkYTQ1ZmEzMzQ2YTRmODk5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NTkxNTg1LDguNTAzODE0Nzk2Mjg1Nzk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmMzQ5OTMyM2ZmZTQyODY5MTE3YTRiMzQ0YjgwYzA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlMWNiZWYyOGY5NjQ5MDFiZGZiYzIwZjUwNDkwNWM4ID0gJCgnPGRpdiBpZD0iaHRtbF81ZTFjYmVmMjhmOTY0OTAxYmRmYmMyMGY1MDQ5MDVjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGVpbnotZ2Vvcmdwb2VsaXR6QGZpZWJpZy5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmMzQ5OTMyM2ZmZTQyODY5MTE3YTRiMzQ0YjgwYzA5LnNldENvbnRlbnQoaHRtbF81ZTFjYmVmMjhmOTY0OTAxYmRmYmMyMGY1MDQ5MDVjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OGI1OGVkNjIzMzg0ODlkYTQ1ZmEzMzQ2YTRmODk5MS5iaW5kUG9wdXAocG9wdXBfMGYzNDk5MzIzZmZlNDI4NjkxMTdhNGIzNDRiODBjMDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGE3ZGE0MzAzOWUzNGFmMjg1ZWM1Zjg4NjA3MjM1NWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAxNjkyLDguNDk0MjcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWUyNzdkN2EwYzY0ODI1OGI3OTFlMTRmZTRkNjcyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MjIxNGE1OTI4N2Y0ZDNiYWJmNmZmYzA4OGQxMTBkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDIyMTRhNTkyODdmNGQzYmFiZjZmZmMwODhkMTEwZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdpZXNlbGExMUBqb2hhbm4uY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWUyNzdkN2EwYzY0ODI1OGI3OTFlMTRmZTRkNjcyYS5zZXRDb250ZW50KGh0bWxfNDIyMTRhNTkyODdmNGQzYmFiZjZmZmMwODhkMTEwZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGE3ZGE0MzAzOWUzNGFmMjg1ZWM1Zjg4NjA3MjM1NWIuYmluZFBvcHVwKHBvcHVwXzk1ZTI3N2Q3YTBjNjQ4MjU4Yjc5MWUxNGZlNGQ2NzJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4YzRmZDdlNDViYjRhOTFiNjAzZjEyNmNhMmRmN2ZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzOTM2Miw4LjQ3NzgyNDQyOTQ3NTQ2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjMzYWQ2M2FkMGY0NGNlYjJlOWE1ZWE2ZDE0ODhmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjkxNDk3NzUyMjk0YmVjOWMxNDg3N2Q2ZGVhN2NjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTY5MTQ5Nzc1MjI5NGJlYzljMTQ4NzdkNmRlYTdjY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNhbWlsbGFydWRvbHBoQGplc3NlbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M2MzNhZDYzYWQwZjQ0Y2ViMmU5YTVlYTZkMTQ4OGYwLnNldENvbnRlbnQoaHRtbF8xNjkxNDk3NzUyMjk0YmVjOWMxNDg3N2Q2ZGVhN2NjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OGM0ZmQ3ZTQ1YmI0YTkxYjYwM2YxMjZjYTJkZjdmYS5iaW5kUG9wdXAocG9wdXBfYzYzM2FkNjNhZDBmNDRjZWIyZTlhNWVhNmQxNDg4ZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2ZkMjc0N2U4YTI1NGFkZjhjMTk5YWFkMzQ0NGU1NzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAxNjkyLDguNDk0MjcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMGM3M2FkMDM5MzY0YmU5YmFhN2U2MDAwMzQ4NzIzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYWU3ODYzNTg5YTA0Y2FmOGIwZTAyYTc4YjMzOGYwYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmFlNzg2MzU4OWEwNGNhZjhiMGUwMmE3OGIzMzhmMGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdpc2JlcnRzY2hsZWljaEBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzBjNzNhZDAzOTM2NGJlOWJhYTdlNjAwMDM0ODcyM2Yuc2V0Q29udGVudChodG1sXzJhZTc4NjM1ODlhMDRjYWY4YjBlMDJhNzhiMzM4ZjBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmZDI3NDdlOGEyNTRhZGY4YzE5OWFhZDM0NDRlNTc2LmJpbmRQb3B1cChwb3B1cF8zMGM3M2FkMDM5MzY0YmU5YmFhN2U2MDAwMzQ4NzIzZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNTdjMjg3NDA3YWQ0YTNlYjAxN2Y0MzBlMTJlOTc2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjk4NjA1LDguNDk0MDk2NDM1NjYzMDg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhMWM1MjYyNDJjZDQ5NThhZDE1MDA3OWEwYWMyOWRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjNTNkZmY0MzZiOTQzNGI4NjNiOGY3MDA3MjE1MDEzID0gJCgnPGRpdiBpZD0iaHRtbF81YzUzZGZmNDM2Yjk0MzRiODYzYjhmNzAwNzIxNTAxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+eXdlaW5oYWdlQGJlaWVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTFjNTI2MjQyY2Q0OTU4YWQxNTAwNzlhMGFjMjlkYy5zZXRDb250ZW50KGh0bWxfNWM1M2RmZjQzNmI5NDM0Yjg2M2I4ZjcwMDcyMTUwMTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDU3YzI4NzQwN2FkNGEzZWIwMTdmNDMwZTEyZTk3NjQuYmluZFBvcHVwKHBvcHVwXzVhMWM1MjYyNDJjZDQ5NThhZDE1MDA3OWEwYWMyOWRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyNTkyYjZmODA5ZTQwYjU4ZjBmNGI0MzA4MmZlZTI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjc1MzBhNTkzMWI4NDc0NDg4OWY1Y2VkZTJiNjllNjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTljZjY0MmFiNmMxNDEwNThhY2EzMDJmOWI5ODMwMmMgPSAkKCc8ZGl2IGlkPSJodG1sX2E5Y2Y2NDJhYjZjMTQxMDU4YWNhMzAyZjliOTgzMDJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ldmVseW5lbG9lZmZsZXJAcGFlcnR6ZWx0LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzUzMGE1OTMxYjg0NzQ0ODg5ZjVjZWRlMmI2OWU2NC5zZXRDb250ZW50KGh0bWxfYTljZjY0MmFiNmMxNDEwNThhY2EzMDJmOWI5ODMwMmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzI1OTJiNmY4MDllNDBiNThmMGY0YjQzMDgyZmVlMjYuYmluZFBvcHVwKHBvcHVwX2Y3NTMwYTU5MzFiODQ3NDQ4ODlmNWNlZGUyYjY5ZTY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhMmRkY2U5ZDFhNTRkZGFhZDhjMzM5YWRlMjM4Y2Q4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2NzM2Myw4LjUxMDYwMDgyNDI4NjM1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZjAyNTNmNjY4ODU0MmNjOTA1ZDk1NDk1ZmI5NDFhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODg2YzU2N2RmZWE0OTI3ODFiM2M3YjMzYTk2YjU5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTg4NmM1NjdkZmVhNDkyNzgxYjNjN2IzM2E5NmI1OWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmZhYmlhbnRydWJAZ2VybGFjaC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VmMDI1M2Y2Njg4NTQyY2M5MDVkOTU0OTVmYjk0MWEwLnNldENvbnRlbnQoaHRtbF9lODg2YzU2N2RmZWE0OTI3ODFiM2M3YjMzYTk2YjU5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YTJkZGNlOWQxYTU0ZGRhYWQ4YzMzOWFkZTIzOGNkOC5iaW5kUG9wdXAocG9wdXBfZWYwMjUzZjY2ODg1NDJjYzkwNWQ5NTQ5NWZiOTQxYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDFhMjVhMGEwNTZiNDgyMDkyY2M5YWRiZTc3ZDI3MGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTU3Mjg4LDguNTA3MzU2MDAxNzM5ODY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyYmY4YjBlMzZjNjRhZTJhMThjOGM3YzI3NDYyMWNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlMDRkMWZmOTE1MzRlMDU4YmY5ZWFmY2VkYzFmZjVmID0gJCgnPGRpdiBpZD0iaHRtbF8zZTA0ZDFmZjkxNTM0ZTA1OGJmOWVhZmNlZGMxZmY1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Ym9sbmJhY2hlZGl0aGFAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzJiZjhiMGUzNmM2NGFlMmExOGM4YzdjMjc0NjIxY2Uuc2V0Q29udGVudChodG1sXzNlMDRkMWZmOTE1MzRlMDU4YmY5ZWFmY2VkYzFmZjVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxYTI1YTBhMDU2YjQ4MjA5MmNjOWFkYmU3N2QyNzBhLmJpbmRQb3B1cChwb3B1cF83MmJmOGIwZTM2YzY0YWUyYTE4YzhjN2MyNzQ2MjFjZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Yjg4ZTE5YzZjZjg0OTkwYTk0Y2QwNDgyNmJmZjlmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjYwNDE1LDguNTA4ODI1MDQwMTQ3OTI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyMzFkYTlkMGUxYTRiMjNiYjg1OGJjNjIyNGFkNTI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjY2RjMDE2M2VmZTQyMTFiODRlOWI1Mjc1ZTYxNjBjID0gJCgnPGRpdiBpZD0iaHRtbF9hY2NkYzAxNjNlZmU0MjExYjg0ZTliNTI3NWU2MTYwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWVpc3Rlcm9saXZlckBzY2hlbmsuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MjMxZGE5ZDBlMWE0YjIzYmI4NThiYzYyMjRhZDUyNy5zZXRDb250ZW50KGh0bWxfYWNjZGMwMTYzZWZlNDIxMWI4NGU5YjUyNzVlNjE2MGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmI4OGUxOWM2Y2Y4NDk5MGE5NGNkMDQ4MjZiZmY5ZjkuYmluZFBvcHVwKHBvcHVwXzcyMzFkYTlkMGUxYTRiMjNiYjg1OGJjNjIyNGFkNTI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4OWIzNGNkYjcwOTQwMGJiOGM2YjRiYzhiOGNjYmFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTk1MzAyZDBiYzE1NGE4ZjkyOGEyNWFjNDY2ZDU0MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZiZDFlM2I2NDhlNDBmNWIzYjk2YmU4NDlmODQ5NDYgPSAkKCc8ZGl2IGlkPSJodG1sX2FmYmQxZTNiNjQ4ZTQwZjViM2I5NmJlODQ5Zjg0OTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53YWxidXJnYWphY29iQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTk1MzAyZDBiYzE1NGE4ZjkyOGEyNWFjNDY2ZDU0MzIuc2V0Q29udGVudChodG1sX2FmYmQxZTNiNjQ4ZTQwZjViM2I5NmJlODQ5Zjg0OTQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4OWIzNGNkYjcwOTQwMGJiOGM2YjRiYzhiOGNjYmFjLmJpbmRQb3B1cChwb3B1cF9lOTUzMDJkMGJjMTU0YThmOTI4YTI1YWM0NjZkNTQzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80N2IzMDAzMTlkMGU0M2JmYWViMDg0MjVlMzA4MTc0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NzI5NzYsOC41MDc5MDYyMDMyMTkxNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM1YzNmMGYyMzIwNDEzMjk5ZDBlMjkwYWQ1ZTViOTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjk3MzQ2YzcxMmFmNDliY2JiZGUwMzgxZTM5MWY4ZmIgPSAkKCc8ZGl2IGlkPSJodG1sXzY5NzM0NmM3MTJhZjQ5YmNiYmRlMDM4MWUzOTFmOGZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5jc3RleUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzNWMzZjBmMjMyMDQxMzI5OWQwZTI5MGFkNWU1Yjk0LnNldENvbnRlbnQoaHRtbF82OTczNDZjNzEyYWY0OWJjYmJkZTAzODFlMzkxZjhmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80N2IzMDAzMTlkMGU0M2JmYWViMDg0MjVlMzA4MTc0Zi5iaW5kUG9wdXAocG9wdXBfZTM1YzNmMGYyMzIwNDEzMjk5ZDBlMjkwYWQ1ZTViOTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk1NDk5MjcyOWM4NDgzNmJmN2Y2ODYwZDZjOWZjNGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMzMzk0LDguNTAyMDUyOTA3OTQ2NTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxYzJlZGFhMDE2ZDQ4Y2I5MGM2MmFlNDczYWViZWZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4OWQ0OTU4ZWE4YTRlYzNhNmYyNTcxN2ZlN2JlMDNiID0gJCgnPGRpdiBpZD0iaHRtbF8wODlkNDk1OGVhOGE0ZWMzYTZmMjU3MTdmZTdiZTAzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2VybmVybWFya0BtZW50emVsLm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODFjMmVkYWEwMTZkNDhjYjkwYzYyYWU0NzNhZWJlZmQuc2V0Q29udGVudChodG1sXzA4OWQ0OTU4ZWE4YTRlYzNhNmYyNTcxN2ZlN2JlMDNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5NTQ5OTI3MjljODQ4MzZiZjdmNjg2MGQ2YzlmYzRiLmJpbmRQb3B1cChwb3B1cF84MWMyZWRhYTAxNmQ0OGNiOTBjNjJhZTQ3M2FlYmVmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MTU3YzI1ZmM4NzE0MzQyYjIyYzAzZDk0MTVlNzdiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzQ4OTksOC40NzkyMTYyMzQ4OTIyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWU5MWZjM2JhMmYzNDU3ZjgxNTM5ZWMyNzgxOTg4YTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmM1ZjI2OWI4OTBjNDBhNGE0ZGJkZDEwOGQxN2MxYWIgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjNWYyNjliODkwYzQwYTRhNGRiZGQxMDhkMTdjMWFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yaGFydG1hbm5AcmluZy5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VlOTFmYzNiYTJmMzQ1N2Y4MTUzOWVjMjc4MTk4OGE2LnNldENvbnRlbnQoaHRtbF9mYzVmMjY5Yjg5MGM0MGE0YTRkYmRkMTA4ZDE3YzFhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MTU3YzI1ZmM4NzE0MzQyYjIyYzAzZDk0MTVlNzdiMC5iaW5kUG9wdXAocG9wdXBfZWU5MWZjM2JhMmYzNDU3ZjgxNTM5ZWMyNzgxOTg4YTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTdlZjBjNWJjYjVhNDZlZGIwZTBmYzM1ZWUyMDU5YzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTgwOTQwNSw4LjUwNjQyMTAxODI3MDI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTA2YjU3NTc2ZWQ0M2VjYTU2ZTdlZjZmMWFjMWM2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNjQ5Mjk3Njk5M2U0ZjFkOTU3Nzk3MWJmOTc1N2I1OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjY0OTI5NzY5OTNlNGYxZDk1Nzc5NzFiZjk3NTdiNTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmZiaW5uZXJAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWUwNmI1NzU3NmVkNDNlY2E1NmU3ZWY2ZjFhYzFjNmUuc2V0Q29udGVudChodG1sXzI2NDkyOTc2OTkzZTRmMWQ5NTc3OTcxYmY5NzU3YjU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3ZWYwYzViY2I1YTQ2ZWRiMGUwZmMzNWVlMjA1OWM0LmJpbmRQb3B1cChwb3B1cF85ZTA2YjU3NTc2ZWQ0M2VjYTU2ZTdlZjZmMWFjMWM2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZDgwZWFhZjVhZjY0YTNkYTUxMGFmMzdiNjY4NzJmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjU2OTgsOC40OTE4NTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjZGQ0ZjY1YjRmYjQ2MjNiMjA1YzMyZjk0NzQzNmVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5MGI1NDU4ODA3NjRlN2FiZGUwYjdhNGFiMzc0NmRlID0gJCgnPGRpdiBpZD0iaHRtbF9jOTBiNTQ1ODgwNzY0ZTdhYmRlMGI3YTRhYjM3NDZkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2NodWVsZXJyb25hbGRAbmFzZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2RkNGY2NWI0ZmI0NjIzYjIwNWMzMmY5NDc0MzZlYy5zZXRDb250ZW50KGh0bWxfYzkwYjU0NTg4MDc2NGU3YWJkZTBiN2E0YWIzNzQ2ZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2Q4MGVhYWY1YWY2NGEzZGE1MTBhZjM3YjY2ODcyZjIuYmluZFBvcHVwKHBvcHVwXzFjZGQ0ZjY1YjRmYjQ2MjNiMjA1YzMyZjk0NzQzNmVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2Nzc2ZDBiOWQxZDQyOGQ4OWUwYTgyMmM0MmY4NjUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2Nzg1MTUwMDAwMDA1LDguNDg5OTUxMjEwMzQ1MzQzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhODk5YmFlM2VmNjQ5MmY4YWI2OWNjMjdlOTc0ZjJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjMDg0ZmEzNDUzYTQ0NTlhYzQ5YjY2NjBhMTQxNjdhID0gJCgnPGRpdiBpZD0iaHRtbF8xYzA4NGZhMzQ1M2E0NDU5YWM0OWI2NjYwYTE0MTY3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2llcnNjaG5lcmFsZnJlZG9AZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBhODk5YmFlM2VmNjQ5MmY4YWI2OWNjMjdlOTc0ZjJhLnNldENvbnRlbnQoaHRtbF8xYzA4NGZhMzQ1M2E0NDU5YWM0OWI2NjYwYTE0MTY3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Njc3NmQwYjlkMWQ0MjhkODllMGE4MjJjNDJmODY1MC5iaW5kUG9wdXAocG9wdXBfMGE4OTliYWUzZWY2NDkyZjhhYjY5Y2MyN2U5NzRmMmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTNkMzJhZGNmNTJkNDNmYmJiNDNkZjVmMGU0ZDdmMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY3MjQsOC40OTU2MzQwNjMyMzQ2MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTUyYjdjNjNmMGJkNDQyMWJiYjM1ODJhY2EwYzAyYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzQ1ZDlmMTZkMDdmNGRjN2IxZjQyZjk0MmJmODA1MDMgPSAkKCc8ZGl2IGlkPSJodG1sXzM0NWQ5ZjE2ZDA3ZjRkYzdiMWY0MmY5NDJiZjgwNTAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5pc2FiZWxsYTUzQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1MmI3YzYzZjBiZDQ0MjFiYmIzNTgyYWNhMGMwMmJmLnNldENvbnRlbnQoaHRtbF8zNDVkOWYxNmQwN2Y0ZGM3YjFmNDJmOTQyYmY4MDUwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85M2QzMmFkY2Y1MmQ0M2ZiYmI0M2RmNWYwZTRkN2YyNy5iaW5kUG9wdXAocG9wdXBfYTUyYjdjNjNmMGJkNDQyMWJiYjM1ODJhY2EwYzAyYmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTk3OGMwZWE2NThhNDNhNjljNDMwMWE5NWZlMWMwYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDU1MzMxLDguNDk4MjgwMzA4MTgxMDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwZGZkZjk1OTE5YTQ4NTY5MmI5YTQxZDRhNmJhOTVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4M2Q4MzY5ZmExNjQ4ZGJhMDkwNGFlN2JjMjk3YTJlID0gJCgnPGRpdiBpZD0iaHRtbF9mODNkODM2OWZhMTY0OGRiYTA5MDRhZTdiYzI5N2EyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aG1hbnNAdHJvZXN0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDBkZmRmOTU5MTlhNDg1NjkyYjlhNDFkNGE2YmE5NWQuc2V0Q29udGVudChodG1sX2Y4M2Q4MzY5ZmExNjQ4ZGJhMDkwNGFlN2JjMjk3YTJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5NzhjMGVhNjU4YTQzYTY5YzQzMDFhOTVmZTFjMGE2LmJpbmRQb3B1cChwb3B1cF9kMGRmZGY5NTkxOWE0ODU2OTJiOWE0MWQ0YTZiYTk1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OWVjNTVlMzdhNTk0NjUyYjNmNzYwYzI4NThkYmE5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzk3NzQ1LDguNDk4MzIwMDgwNzY4NzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0ZDM5MzJlZmZiYzQ0OTc5MDAxMGM0OTUyMGNhZGFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4YjY5MzllNjZhMTRjNzNhNGE2YzY3OTEzODA1MjUyID0gJCgnPGRpdiBpZD0iaHRtbF84OGI2OTM5ZTY2YTE0YzczYTRhNmM2NzkxMzgwNTI1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2VybGFjaGdlcmhhcmR0QGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRkMzkzMmVmZmJjNDQ5NzkwMDEwYzQ5NTIwY2FkYWYuc2V0Q29udGVudChodG1sXzg4YjY5MzllNjZhMTRjNzNhNGE2YzY3OTEzODA1MjUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5ZWM1NWUzN2E1OTQ2NTJiM2Y3NjBjMjg1OGRiYTliLmJpbmRQb3B1cChwb3B1cF82NGQzOTMyZWZmYmM0NDk3OTAwMTBjNDk1MjBjYWRhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NzNiMGJkZTY3ZDU0ZWYzYjJmM2NhMzQ3MjcxYmRiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMTA0ODA1MDAwMDAwNSw4LjQ4NzAzMDkxNTk4NTcwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZjg3YTcxNWMxYmQ0NjA1OGI5M2E1Mjk0YTg0ZTdkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYTk3NDAzMGUyZGI0ZTIzOTAwMTViMWRmZmEzMzA3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWE5NzQwMzBlMmRiNGUyMzkwMDE1YjFkZmZhMzMwNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhhcmR5NjhAYm9sem1hbm4uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmODdhNzE1YzFiZDQ2MDU4YjkzYTUyOTRhODRlN2RlLnNldENvbnRlbnQoaHRtbF9hYTk3NDAzMGUyZGI0ZTIzOTAwMTViMWRmZmEzMzA3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NzNiMGJkZTY3ZDU0ZWYzYjJmM2NhMzQ3MjcxYmRiNy5iaW5kUG9wdXAocG9wdXBfYmY4N2E3MTVjMWJkNDYwNThiOTNhNTI5NGE4NGU3ZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWFlNzk3MjcxOTU5NDFiMmJiY2NmMTg4MTg1ZDcxMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDczNTY2NSw4LjQ5NTE0MjMxOTY3MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzNTM0ZTViY2M5MzQ5YWJhNDU4MTZkZGI1NjFmNDc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4NjI2NWIxZGM2ZDQzYmFhMTEwMGVjZjJjMDIzZDU4ID0gJCgnPGRpdiBpZD0iaHRtbF9mODYyNjViMWRjNmQ0M2JhYTExMDBlY2YyYzAyM2Q1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aHVnbzMzQGJvbGFuZGVyLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTM1MzRlNWJjYzkzNDlhYmE0NTgxNmRkYjU2MWY0Nzguc2V0Q29udGVudChodG1sX2Y4NjI2NWIxZGM2ZDQzYmFhMTEwMGVjZjJjMDIzZDU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhZTc5NzI3MTk1OTQxYjJiYmNjZjE4ODE4NWQ3MTIxLmJpbmRQb3B1cChwb3B1cF9lMzUzNGU1YmNjOTM0OWFiYTQ1ODE2ZGRiNTYxZjQ3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMzVkNjM5NTE4NTk0YTcyOTE0OTBmNDdkZjAyZTAyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzI0NTI1LDguNDkyMzE2OTkyMjk0NDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGMxZWU0OTlhMTZjNDI0YzkwMDEyZjY1ZDU0MTc4NzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2IyY2MwMjJlNjE1NDllZjhjZjM5MWI4YzI1MjE4NTQgPSAkKCc8ZGl2IGlkPSJodG1sXzNiMmNjMDIyZTYxNTQ5ZWY4Y2YzOTFiOGMyNTIxODU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tb2VjaGxpY2hlbmxqdWJpY2FAd2llbG9jaC5vcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjMWVlNDk5YTE2YzQyNGM5MDAxMmY2NWQ1NDE3ODc2LnNldENvbnRlbnQoaHRtbF8zYjJjYzAyMmU2MTU0OWVmOGNmMzkxYjhjMjUyMTg1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzVkNjM5NTE4NTk0YTcyOTE0OTBmNDdkZjAyZTAyOC5iaW5kUG9wdXAocG9wdXBfZGMxZWU0OTlhMTZjNDI0YzkwMDEyZjY1ZDU0MTc4NzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTgzNmUyNjg1ZWExNDI2MDljZTZjMGExOWUzYmFkNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDc0NTM3LDguNDg4MzI4OTI4MDEyMDQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2M2YxZDUwN2ZlNDRjNjE5YzExY2E5MmU4ZGY0NmZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY0ZTQ5ZjAzYWIzNTQ2NGZiZDU2ZGMwZjdiZWYxZDA0ID0gJCgnPGRpdiBpZD0iaHRtbF82NGU0OWYwM2FiMzU0NjRmYmQ1NmRjMGY3YmVmMWQwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG90dGk0NkBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc2M2YxZDUwN2ZlNDRjNjE5YzExY2E5MmU4ZGY0NmZhLnNldENvbnRlbnQoaHRtbF82NGU0OWYwM2FiMzU0NjRmYmQ1NmRjMGY3YmVmMWQwNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODM2ZTI2ODVlYTE0MjYwOWNlNmMwYTE5ZTNiYWQ2YS5iaW5kUG9wdXAocG9wdXBfNzYzZjFkNTA3ZmU0NGM2MTljMTFjYTkyZThkZjQ2ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzhhY2VhMWI3ZTk5NDhhZmJlNTExMjgzYzdiODY3MjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTU1NzE3NSw4LjUxNDIwOTk1MDQwMDgxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2E0NWFmZTM3NWM0NjkwYTQzOGZhZTMzZGFhMTllZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGUxMjdmZTk5ZjY0OTBkYTAzYTI3YjkwMmNmMTJkNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGRlMTI3ZmU5OWY2NDkwZGEwM2EyN2I5MDJjZjEyZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNrYWJ1c0Bnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTNhNDVhZmUzNzVjNDY5MGE0MzhmYWUzM2RhYTE5ZWUuc2V0Q29udGVudChodG1sXzBkZTEyN2ZlOTlmNjQ5MGRhMDNhMjdiOTAyY2YxMmQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M4YWNlYTFiN2U5OTQ4YWZiZTUxMTI4M2M3Yjg2NzI1LmJpbmRQb3B1cChwb3B1cF9hM2E0NWFmZTM3NWM0NjkwYTQzOGZhZTMzZGFhMTllZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMzU2MGQ5Y2Y2MGU0NDYxYjYzNzFiNTM4NmNkYTYxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzI3NDg1LDguNTAzODg1ODUxMTI2NTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGQ2MTcxOGVkMTEyNGFmMGJiYzJiMmMyOTI3NGQ1ZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzU4MTlkYTFmODAwNDhjZTkxNzQyZjljMDIzY2VjNTMgPSAkKCc8ZGl2IGlkPSJodG1sX2M1ODE5ZGExZjgwMDQ4Y2U5MTc0MmY5YzAyM2NlYzUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ib3Vjc2Vpbmthcmwtam9zZWZAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkNjE3MThlZDExMjRhZjBiYmMyYjJjMjkyNzRkNWRlLnNldENvbnRlbnQoaHRtbF9jNTgxOWRhMWY4MDA0OGNlOTE3NDJmOWMwMjNjZWM1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMzU2MGQ5Y2Y2MGU0NDYxYjYzNzFiNTM4NmNkYTYxNy5iaW5kUG9wdXAocG9wdXBfOGQ2MTcxOGVkMTEyNGFmMGJiYzJiMmMyOTI3NGQ1ZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM0M2I0N2FlNWFmNDRjNDliZTBjMTU2MDM0ZGMzYmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1MjczLDguNDkyNTM3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTY1ZjA0N2NlMzM0OTI0OGRhMjNlOTM4MWQ0YmM3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDY3M2JmNmM2ZTc0OWNhYmE0ODk3NmQwZDE0Yzc3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQ2NzNiZjZjNmU3NDljYWJhNDg5NzZkMGQxNGM3NzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5ldXNjaGFlZmVyZW1pbEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWE2NWYwNDdjZTMzNDkyNDhkYTIzZTkzODFkNGJjNzAuc2V0Q29udGVudChodG1sX2Y0NjczYmY2YzZlNzQ5Y2FiYTQ4OTc2ZDBkMTRjNzc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJjNDNiNDdhZTVhZjQ0YzQ5YmUwYzE1NjAzNGRjM2JiLmJpbmRQb3B1cChwb3B1cF85YTY1ZjA0N2NlMzM0OTI0OGRhMjNlOTM4MWQ0YmM3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTM1MTY2ZmY5MWU0MmQ2OWEzOWIyODY0MWVmMDU1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNDA2OTQ1LDguNDgwMzY2NzE5MjQ1MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzMzY2MTMyNGIzMTQwNTA5OTA0MjkyZjA0Mzk3MzI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczMmU2NTI1MGVjYTQ5NzZhYWMyYTI5ZDA1YmM1Y2Q1ID0gJCgnPGRpdiBpZD0iaHRtbF83MzJlNjUyNTBlY2E0OTc2YWFjMmEyOWQwNWJjNWNkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2Nob2VubGFuZG5hdGFsaWFAaGVzZXIubmV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzM2NjEzMjRiMzE0MDUwOTkwNDI5MmYwNDM5NzMyNC5zZXRDb250ZW50KGh0bWxfNzMyZTY1MjUwZWNhNDk3NmFhYzJhMjlkMDViYzVjZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDkzNTE2NmZmOTFlNDJkNjlhMzliMjg2NDFlZjA1NTUuYmluZFBvcHVwKHBvcHVwXzkzMzY2MTMyNGIzMTQwNTA5OTA0MjkyZjA0Mzk3MzI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2OTQ1N2UyY2I3MTQ3NmFhYWUxNTNkYWUyMzg4Mjk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEwNTY2OSw4LjQ4MzYyMDA2ODg5NTkwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjlhN2U0NWJkNGI0Y2IwYTE5NDExOTcwZjllN2VjMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZjI4NjZlMGI4OGM0MWU0ODBkNGFjNmEwMWNjNmZiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmYyODY2ZTBiODhjNDFlNDgwZDRhYzZhMDFjYzZmYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1hcmxpZXNld2Vpc3NAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZjlhN2U0NWJkNGI0Y2IwYTE5NDExOTcwZjllN2VjMy5zZXRDb250ZW50KGh0bWxfZmYyODY2ZTBiODhjNDFlNDgwZDRhYzZhMDFjYzZmYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzY5NDU3ZTJjYjcxNDc2YWFhZTE1M2RhZTIzODgyOTUuYmluZFBvcHVwKHBvcHVwX2FmOWE3ZTQ1YmQ0YjRjYjBhMTk0MTE5NzBmOWU3ZWMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhMzljY2U2ZDFiYjQxODhhMjU0NjY0Y2MxNDk0NTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTM2OSw4LjQ5Mjk2MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODRjNTQwZDg2Njc5NGZhNmFhOTUyOTJiZDllMzczZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGMzYWY1MmUyODJkNDdjNGJiNTE1YmExMjUwOGQ3OWQgPSAkKCc8ZGl2IGlkPSJodG1sXzRjM2FmNTJlMjgyZDQ3YzRiYjUxNWJhMTI1MDhkNzlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zYWV1YmVybGljaGhhbnMtd2lsbGlAcmVpbmhhcmR0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRjNTQwZDg2Njc5NGZhNmFhOTUyOTJiZDllMzczZDUuc2V0Q29udGVudChodG1sXzRjM2FmNTJlMjgyZDQ3YzRiYjUxNWJhMTI1MDhkNzlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhMzljY2U2ZDFiYjQxODhhMjU0NjY0Y2MxNDk0NTUwLmJpbmRQb3B1cChwb3B1cF84NGM1NDBkODY2Nzk0ZmE2YWE5NTI5MmJkOWUzNzNkNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjcxNjMwMzRlN2E0ZTIyODJjODE5ODFkZTM4OTk4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzUxMjEsOC40Nzg2ODk3NTQ4OTc1NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNjNDVlNjU1N2YyNGQxYWI4OGQ1NzllNzVhMDA1OWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNjOWUxNDRmMGJkNDgwYTk0NTBlYTBiNjVmZjFmY2MgPSAkKCc8ZGl2IGlkPSJodG1sXzFjYzllMTQ0ZjBiZDQ4MGE5NDUwZWEwYjY1ZmYxZmNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53aWxtc2Vua2Fyb2xhQHNhZXViZXJsaWNoLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjNjNDVlNjU1N2YyNGQxYWI4OGQ1NzllNzVhMDA1OWEuc2V0Q29udGVudChodG1sXzFjYzllMTQ0ZjBiZDQ4MGE5NDUwZWEwYjY1ZmYxZmNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiNzE2MzAzNGU3YTRlMjI4MmM4MTk4MWRlMzg5OThhLmJpbmRQb3B1cChwb3B1cF9iM2M0NWU2NTU3ZjI0ZDFhYjg4ZDU3OWU3NWEwMDU5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YjgwZTBiMzVhNGU0NWFkYjAzMTY2Nzk0N2ZlYmJkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzQ5MjQsOC40OTczNDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyOTViN2QzNTQxMTRkMjBiZjAyNTc3OTM1ZjI5YTY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YmNhMzQ5YjJiOTQyOWViY2ZjNWViNDU1ZDc2ZGE2ID0gJCgnPGRpdiBpZD0iaHRtbF8yNmJjYTM0OWIyYjk0MjllYmNmYzVlYjQ1NWQ3NmRhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aXJpczM4QGJleWVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83Mjk1YjdkMzU0MTE0ZDIwYmYwMjU3NzkzNWYyOWE2OS5zZXRDb250ZW50KGh0bWxfMjZiY2EzNDliMmI5NDI5ZWJjZmM1ZWI0NTVkNzZkYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI4MGUwYjM1YTRlNDVhZGIwMzE2Njc5NDdmZWJiZDYuYmluZFBvcHVwKHBvcHVwXzcyOTViN2QzNTQxMTRkMjBiZjAyNTc3OTM1ZjI5YTY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjM2ZmMDQ4NjY5NjQ4NjVhNDdmMDJmZWVjZTQ0ZjE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE2NjIzLDguNDgxMzYzNzIzMDIzMjU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2ZGEzZjdjOTM4MTQxODA5YTFkYmUyMTEzNWJkMDY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUzYzdkMWU1OTViYjQyMGNhNWNiYWNiMDljMDk0ZDI5ID0gJCgnPGRpdiBpZD0iaHRtbF81M2M3ZDFlNTk1YmI0MjBjYTVjYmFjYjA5YzA5NGQyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3JhdXNlZXJkb2dhbkBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2ZGEzZjdjOTM4MTQxODA5YTFkYmUyMTEzNWJkMDY1LnNldENvbnRlbnQoaHRtbF81M2M3ZDFlNTk1YmI0MjBjYTVjYmFjYjA5YzA5NGQyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YzNmZjA0ODY2OTY0ODY1YTQ3ZjAyZmVlY2U0NGYxNi5iaW5kUG9wdXAocG9wdXBfMzZkYTNmN2M5MzgxNDE4MDlhMWRiZTIxMTM1YmQwNjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDM3MWM0NzEyZmI3NDA4NWFhNTg5MWVmMTZhMzkyNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDU0MjAxLDguNDk4Njg1NTQwODIzNjY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1MzA0OGIwOTcxZjQ0ZjU5MThiZjYyN2JiNjZkOTE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IzY2QxZjhlNTNiYzRiNWNiYjUxM2MwMjAwNzAzMWY4ID0gJCgnPGRpdiBpZD0iaHRtbF9iM2NkMWY4ZTUzYmM0YjVjYmI1MTNjMDIwMDcwMzFmOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cnVwcGVyc2JlcmdlcnN5bHZpZUBzY2hpbmtlLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTMwNDhiMDk3MWY0NGY1OTE4YmY2MjdiYjY2ZDkxNy5zZXRDb250ZW50KGh0bWxfYjNjZDFmOGU1M2JjNGI1Y2JiNTEzYzAyMDA3MDMxZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDM3MWM0NzEyZmI3NDA4NWFhNTg5MWVmMTZhMzkyNWMuYmluZFBvcHVwKHBvcHVwXzE1MzA0OGIwOTcxZjQ0ZjU5MThiZjYyN2JiNjZkOTE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhY2UxYjgzZDFkZjQ5YTI4NzE3YzY1ZGY4NzkxNjJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk3Nzg5MSw4LjUxMTU4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTZkOGJjYjQxMTA0NGQ5Mjg0MjRmNjlmYjg2OTBjN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTM4ZTU5NmVmOTAzNDQ2MThhNzYyODA4YjEwMDgyOGEgPSAkKCc8ZGl2IGlkPSJodG1sXzkzOGU1OTZlZjkwMzQ0NjE4YTc2MjgwOGIxMDA4MjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zY2hlZWxyb3NlbGluZGVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NmQ4YmNiNDExMDQ0ZDkyODQyNGY2OWZiODY5MGM3ZS5zZXRDb250ZW50KGh0bWxfOTM4ZTU5NmVmOTAzNDQ2MThhNzYyODA4YjEwMDgyOGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWFjZTFiODNkMWRmNDlhMjg3MTdjNjVkZjg3OTE2MmEuYmluZFBvcHVwKHBvcHVwXzU2ZDhiY2I0MTEwNDRkOTI4NDI0ZjY5ZmI4NjkwYzdlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNkMTE1MWVhZDgwMTQ3NmJhMjYzODYwYTFkNGVkZGRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwNjcwNCw4LjUwNzc4OTk1MjM5NDQ1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNmQ0MDIyYTA0ZDQ0NjgyYjYxYWU2OGRiZDI1OGRkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OGU0ZjBiNzFmMzE0YmUyYTIwNjQ0MDZjNDAzNDg1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjhlNGYwYjcxZjMxNGJlMmEyMDY0NDA2YzQwMzQ4NTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmd1ZW50ZXJnb3R0aGFyZEBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2ZDQwMjJhMDRkNDQ2ODJiNjFhZTY4ZGJkMjU4ZGRlLnNldENvbnRlbnQoaHRtbF82OGU0ZjBiNzFmMzE0YmUyYTIwNjQ0MDZjNDAzNDg1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZDExNTFlYWQ4MDE0NzZiYTI2Mzg2MGExZDRlZGRkZi5iaW5kUG9wdXAocG9wdXBfMDZkNDAyMmEwNGQ0NDY4MmI2MWFlNjhkYmQyNThkZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGIyNzU3YzVhNjAxNDJjMTgzNzVmZWViYmJlZDZmMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM5Nzc0NSw4LjQ5ODMyMDA4MDc2ODcyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjQyNTYwNDRhMWY0ZGU4Yjk1NTg1YTJmYTFiOWNiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yY2U4MTk5YTBhYzQ0ZDRhODkyZDc2NGI2NGMzNjY5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmNlODE5OWEwYWM0NGQ0YTg5MmQ3NjRiNjRjMzY2OWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFuZ2VsaWNhYmxvY2hAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjQyNTYwNDRhMWY0ZGU4Yjk1NTg1YTJmYTFiOWNiZi5zZXRDb250ZW50KGh0bWxfMmNlODE5OWEwYWM0NGQ0YTg5MmQ3NjRiNjRjMzY2OWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGIyNzU3YzVhNjAxNDJjMTgzNzVmZWViYmJlZDZmMmQuYmluZFBvcHVwKHBvcHVwX2M2NDI1NjA0NGExZjRkZThiOTU1ODVhMmZhMWI5Y2JmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwMDAyZWIzNWIyNjQyMDFhZGFiMzA2OGMxYzMyODQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDExNTkyMjk5OTk5OTk1LDguNDg1NTc4NzI2NDM3NjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2ZmUyZTM0ZDRhYjRhYjA4ODhjOTFmNzE3Yzc1NGM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyMDdjNzQxMTgzNjQ3YzliNDU4Njk5MTY2NmJiYjBhID0gJCgnPGRpdiBpZD0iaHRtbF9iMjA3Yzc0MTE4MzY0N2M5YjQ1ODY5OTE2NjZiYmIwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+eHNjaHVlbGVyQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTZmZTJlMzRkNGFiNGFiMDg4OGM5MWY3MTdjNzU0YzYuc2V0Q29udGVudChodG1sX2IyMDdjNzQxMTgzNjQ3YzliNDU4Njk5MTY2NmJiYjBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwMDAyZWIzNWIyNjQyMDFhZGFiMzA2OGMxYzMyODQzLmJpbmRQb3B1cChwb3B1cF8xNmZlMmUzNGQ0YWI0YWIwODg4YzkxZjcxN2M3NTRjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNzU4MDQ2NjZkMmM0NDhjODgzNDA2MzU2OTNhZjQ1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzA1NDU1LDguNDc5NTUyNzY1NDI5MTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5YTBlNjk1M2QyYjQ0YWQ5MmQwOWQ5NDQ0ZDUzZDEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5NTQ0ODk4Zjg5NzQ4NTA4NmQ0MTM1MzJjMTE1ZDA3ID0gJCgnPGRpdiBpZD0iaHRtbF81OTU0NDg5OGY4OTc0ODUwODZkNDEzNTMyYzExNWQwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2lydGhoZW5yeWtAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5YTBlNjk1M2QyYjQ0YWQ5MmQwOWQ5NDQ0ZDUzZDEyLnNldENvbnRlbnQoaHRtbF81OTU0NDg5OGY4OTc0ODUwODZkNDEzNTMyYzExNWQwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNzU4MDQ2NjZkMmM0NDhjODgzNDA2MzU2OTNhZjQ1NS5iaW5kUG9wdXAocG9wdXBfOTlhMGU2OTUzZDJiNDRhZDkyZDA5ZDk0NDRkNTNkMTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzU2NjRiZGNmMDNjNGJkZjk0NTJhMzlmNDJhMTE1MmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDEwNjc5OTk5OTk5OTUsOC40OTg2NjA5MDAwNTg0NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjI2NDFhNzJjMDJiNGYwMmI1Mjc3ODcxM2FjMWUxZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGRkZTU1ZjZhNjQ1NGYyNGIwY2EzMjMzNGM3NTY5ZmEgPSAkKCc8ZGl2IGlkPSJodG1sX2RkZGU1NWY2YTY0NTRmMjRiMGNhMzIzMzRjNzU2OWZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zZWxtYWF1c3Rlcm11ZWhsZUBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI2NDFhNzJjMDJiNGYwMmI1Mjc3ODcxM2FjMWUxZTYuc2V0Q29udGVudChodG1sX2RkZGU1NWY2YTY0NTRmMjRiMGNhMzIzMzRjNzU2OWZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NjY0YmRjZjAzYzRiZGY5NDUyYTM5ZjQyYTExNTJjLmJpbmRQb3B1cChwb3B1cF8yMjY0MWE3MmMwMmI0ZjAyYjUyNzc4NzEzYWMxZTFlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTMzZDBhYTY0MTA0OThjODMxNmQ2MzdmNTU1NDRjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjA4MTQsOC41MDYxNDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmMzA2YTE1OTViMzQyNDc5N2E5ZjM5YmQ3MDllOWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5ZDgxZGYzNDlhZjQxMzU5NjcwZjcyYmU3YWQ1MzhkID0gJCgnPGRpdiBpZD0iaHRtbF85OWQ4MWRmMzQ5YWY0MTM1OTY3MGY3MmJlN2FkNTM4ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cnVwcGVydGNvbnN0YW5jZUBiYXJ0aC5vcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmMzA2YTE1OTViMzQyNDc5N2E5ZjM5YmQ3MDllOWE1LnNldENvbnRlbnQoaHRtbF85OWQ4MWRmMzQ5YWY0MTM1OTY3MGY3MmJlN2FkNTM4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTMzZDBhYTY0MTA0OThjODMxNmQ2MzdmNTU1NDRjMC5iaW5kUG9wdXAocG9wdXBfM2YzMDZhMTU5NWIzNDI0Nzk3YTlmMzliZDcwOWU5YTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDJhOTFmNDQ4NGFkNGI1NTllZGQ1MTkzZmQzMWJjYTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcwNTQ1NSw4LjQ3OTU1Mjc2NTQyOTEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTJiZmQxZjM1NmY0ZDRhYTQ1MGRiYTViMjMwYzUyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZjRlM2I0MDIzNTc0YzE2YmQxNWE3ODk4MzkyYThlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWY0ZTNiNDAyMzU3NGMxNmJkMTVhNzg5ODM5MmE4ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmZsYW50emVtaW5lQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODkyYmZkMWYzNTZmNGQ0YWE0NTBkYmE1YjIzMGM1MmMuc2V0Q29udGVudChodG1sX2FmNGUzYjQwMjM1NzRjMTZiZDE1YTc4OTgzOTJhOGU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyYTkxZjQ0ODRhZDRiNTU5ZWRkNTE5M2ZkMzFiY2E1LmJpbmRQb3B1cChwb3B1cF84OTJiZmQxZjM1NmY0ZDRhYTQ1MGRiYTViMjMwYzUyYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYTVhMmUwNmU5Nzg0YzBmOWQ5NTJjNWRlNDk0ZmZmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTE3MjEsOC40OTc4NDUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYjA2OTNhNzM4Yzk0NTNkODI4MDEyNjM0YTlhNTMzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTliMGRhMzIwOTQ0Njk2OTlhOTNlNGFkZTdhNjlmMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE5YjBkYTMyMDk0NDY5Njk5YTkzZTRhZGU3YTY5ZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhvZmZtYW5uY2VudGFAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjA2OTNhNzM4Yzk0NTNkODI4MDEyNjM0YTlhNTMzNy5zZXRDb250ZW50KGh0bWxfZDE5YjBkYTMyMDk0NDY5Njk5YTkzZTRhZGU3YTY5ZjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGE1YTJlMDZlOTc4NGMwZjlkOTUyYzVkZTQ5NGZmZjguYmluZFBvcHVwKHBvcHVwX2RiMDY5M2E3MzhjOTQ1M2Q4MjgwMTI2MzRhOWE1MzM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiODNlZjI0MWQ0ZTQ4OTBhNWYxZWIxY2JjOGYyNTlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MjEzODUsOC40OTQyOTY0MDA0NjI3NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGNmMzE3MmEyODExNDRhMTk5OTdlNThkMjMxNDFhMmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjk1ZDQ5YWRjYjEzNDNlZGFlMmNiM2E5ODQ5NDRhOTIgPSAkKCc8ZGl2IGlkPSJodG1sX2I5NWQ0OWFkY2IxMzQzZWRhZTJjYjNhOTg0OTQ0YTkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5jb3JkOThAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhjZjMxNzJhMjgxMTQ0YTE5OTk3ZTU4ZDIzMTQxYTJkLnNldENvbnRlbnQoaHRtbF9iOTVkNDlhZGNiMTM0M2VkYWUyY2IzYTk4NDk0NGE5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YjgzZWYyNDFkNGU0ODkwYTVmMWViMWNiYzhmMjU5YS5iaW5kUG9wdXAocG9wdXBfOGNmMzE3MmEyODExNDRhMTk5OTdlNThkMjMxNDFhMmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTFjNTU2MmIxN2QyNGJlZjliNTc0MjhlMWY2ZDJkMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDc1MTA0LDguNDg1OTMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNzI4NzlkN2ZlNWQ0MTI1YTc4MTkwZGUwNWYxODM1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NzUxZDdlYjM3Y2Y0NGE0YmZkZjAxMzRlMzFkZDY5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjc1MWQ3ZWIzN2NmNDRhNGJmZGYwMTM0ZTMxZGQ2OTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmRlbm55NDhAaGVsbHdpZy5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzcyODc5ZDdmZTVkNDEyNWE3ODE5MGRlMDVmMTgzNTQuc2V0Q29udGVudChodG1sXzY3NTFkN2ViMzdjZjQ0YTRiZmRmMDEzNGUzMWRkNjkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExYzU1NjJiMTdkMjRiZWY5YjU3NDI4ZTFmNmQyZDFmLmJpbmRQb3B1cChwb3B1cF8zNzI4NzlkN2ZlNWQ0MTI1YTc4MTkwZGUwNWYxODM1NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjMyMmVlNTVmZWM0ZTdiOTJlZjg4NTA1MGI2NTJmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTU3OTYsOC41MDM0NTY1NzgxMzM2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZhNDg0NTFjNGFmNDkyNGI0MTQ3MDNjYWI3MjliYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmRmODVkYzVhMmQxNDhjNGI2ZTVlNTRlMTMzZmVmOGQgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkZjg1ZGM1YTJkMTQ4YzRiNmU1ZTU0ZTEzM2ZlZjhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5qYW5uYTc3QGdpZXNzLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZmE0ODQ1MWM0YWY0OTI0YjQxNDcwM2NhYjcyOWJjMi5zZXRDb250ZW50KGh0bWxfZmRmODVkYzVhMmQxNDhjNGI2ZTVlNTRlMTMzZmVmOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2IzMjJlZTU1ZmVjNGU3YjkyZWY4ODUwNTBiNjUyZjkuYmluZFBvcHVwKHBvcHVwXzVmYTQ4NDUxYzRhZjQ5MjRiNDE0NzAzY2FiNzI5YmMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlMzk4NmFiZDgxMTRkMTFiZDk3OThjMGMyOWQzMTJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE2NDY5Myw4LjQ4MjMyMjI0ODI4NzQwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWU2MWFkNTVhN2Q0Zjc5OGM1Zjg2ZjAwYzE2OWFlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOGU2YjM5NjU4NjE0MTUzYWM0MTI4MGFlMGQ1NDI5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZThlNmIzOTY1ODYxNDE1M2FjNDEyODBhZTBkNTQyOWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5hc2VyZGFnb2JlcnRAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhZTYxYWQ1NWE3ZDRmNzk4YzVmODZmMDBjMTY5YWVkLnNldENvbnRlbnQoaHRtbF9lOGU2YjM5NjU4NjE0MTUzYWM0MTI4MGFlMGQ1NDI5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZTM5ODZhYmQ4MTE0ZDExYmQ5Nzk4YzBjMjlkMzEyYi5iaW5kUG9wdXAocG9wdXBfZWFlNjFhZDU1YTdkNGY3OThjNWY4NmYwMGMxNjlhZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTA1MjgyMmY3OTIwNDAzNzkyMGQxM2Y1OGNkZGQ2MDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1MjczLDguNDkyNTM3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOTQ5YjA4YWU3OTY0YWNmYTNhYmE0YTY4MGI2YThjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTljNjc5OGQyMWI0YmY4YjA2NWZhNjg2MzZjYTQ1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2E5YzY3OThkMjFiNGJmOGIwNjVmYTY4NjM2Y2E0NWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFobWFkZGlwcGVsQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjk0OWIwOGFlNzk2NGFjZmEzYWJhNGE2ODBiNmE4Yzcuc2V0Q29udGVudChodG1sXzdhOWM2Nzk4ZDIxYjRiZjhiMDY1ZmE2ODYzNmNhNDViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwNTI4MjJmNzkyMDQwMzc5MjBkMTNmNThjZGRkNjA0LmJpbmRQb3B1cChwb3B1cF9mOTQ5YjA4YWU3OTY0YWNmYTNhYmE0YTY4MGI2YThjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjhiYjRiYjRlNWQ0MWM1YTgzMDlmOTI3ZGJjNDU1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NzIzOTcsOC41MDI5OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5YWE5OWMyYzY4MjRlNjBiYzJhYjFlZjMyZGU2ZmQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2ZDQxMTk1MWYzNzQ0OTNhYjg4YjgyNDYwMGYwYmZmID0gJCgnPGRpdiBpZD0iaHRtbF8zNmQ0MTE5NTFmMzc0NDkzYWI4OGI4MjQ2MDBmMGJmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Y2hyaXN0b3BoZXI4NkBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5YWE5OWMyYzY4MjRlNjBiYzJhYjFlZjMyZGU2ZmQ2LnNldENvbnRlbnQoaHRtbF8zNmQ0MTE5NTFmMzc0NDkzYWI4OGI4MjQ2MDBmMGJmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYjhiYjRiYjRlNWQ0MWM1YTgzMDlmOTI3ZGJjNDU1Yy5iaW5kUG9wdXAocG9wdXBfODlhYTk5YzJjNjgyNGU2MGJjMmFiMWVmMzJkZTZmZDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTlmMTFmMGRjMGIwNDJhNWFmMDQxNmY2ZmI4NTdkZTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTMwNDg2NSw4LjQ3ODAyNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDdkODZhODg5MjUxNGZkNzljZDQ5YTAyZWUwNGQwYWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGI4ZjBlODdjMjAzNGZjY2IyZThlYTEzNWM5ZjIwODQgPSAkKCc8ZGl2IGlkPSJodG1sXzhiOGYwZTg3YzIwMzRmY2NiMmU4ZWExMzVjOWYyMDg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yb3NhLW1hcmlhc2NobWlkdEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3ZDg2YTg4OTI1MTRmZDc5Y2Q0OWEwMmVlMDRkMGFiLnNldENvbnRlbnQoaHRtbF84YjhmMGU4N2MyMDM0ZmNjYjJlOGVhMTM1YzlmMjA4NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOWYxMWYwZGMwYjA0MmE1YWYwNDE2ZjZmYjg1N2RlMy5iaW5kUG9wdXAocG9wdXBfMDdkODZhODg5MjUxNGZkNzljZDQ5YTAyZWUwNGQwYWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjlmNTU2M2M0NjNiNGI1NmE1NWQwNTcyMGViMmJmODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTUwOTIzNSw4LjQ3ODY5NzY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiNmVkYzdhMDViYTQ4OTZhYmYwZWIzYzEyYmU2ZjBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxMjRkZjQ4YzA5MDQ5ZjZiNjMzMDk0Y2FhMzNlZjdmID0gJCgnPGRpdiBpZD0iaHRtbF9kMTI0ZGY0OGMwOTA0OWY2YjYzMzA5NGNhYTMzZWY3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aG9yc3RicnVkZXJAaGFtYW5uLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjZlZGM3YTA1YmE0ODk2YWJmMGViM2MxMmJlNmYwYS5zZXRDb250ZW50KGh0bWxfZDEyNGRmNDhjMDkwNDlmNmI2MzMwOTRjYWEzM2VmN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjlmNTU2M2M0NjNiNGI1NmE1NWQwNTcyMGViMmJmODcuYmluZFBvcHVwKHBvcHVwXzdiNmVkYzdhMDViYTQ4OTZhYmYwZWIzYzEyYmU2ZjBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2YjZjODZmYWI0NTQ5MWJhYzVhZGZiOWE5YTk0YzM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2MjM2MSw4LjQ5NTAxNjI0OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZTY4NTFhNGI1MTg0NjQ0YmNlMWIzYTM2MTRjOGI1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjE5YzNlZmJkMWU0MjZiOTM4MmRkYWZlNTUyYTRhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGIxOWMzZWZiZDFlNDI2YjkzODJkZGFmZTU1MmE0YWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJvZXJyaWNodG1hcmlhQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWU2ODUxYTRiNTE4NDY0NGJjZTFiM2EzNjE0YzhiNTkuc2V0Q29udGVudChodG1sXzBiMTljM2VmYmQxZTQyNmI5MzgyZGRhZmU1NTJhNGFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E2YjZjODZmYWI0NTQ5MWJhYzVhZGZiOWE5YTk0YzM2LmJpbmRQb3B1cChwb3B1cF9lZTY4NTFhNGI1MTg0NjQ0YmNlMWIzYTM2MTRjOGI1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWJhMWNjZjkxNTY0YjRlOGI5ODY1OTk2NThlYzY1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODY4NzQsOC41MDI5NzA0NDE5NTE2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzliNTVkMzhmODQ1NGExOGJhMTY3ZGRjZTcyNjU0MmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDc3ZWNmYjlmMDk3NDEzNWIzNzcyNjI3ZWU0MzNiOTUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ3N2VjZmI5ZjA5NzQxMzViMzc3MjYyN2VlNDMzYjk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5saXNlbG90dGUyOUByaXR0ZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOWI1NWQzOGY4NDU0YTE4YmExNjdkZGNlNzI2NTQyYS5zZXRDb250ZW50KGh0bWxfNDc3ZWNmYjlmMDk3NDEzNWIzNzcyNjI3ZWU0MzNiOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWFiYTFjY2Y5MTU2NGI0ZThiOTg2NTk5NjU4ZWM2NWUuYmluZFBvcHVwKHBvcHVwX2M5YjU1ZDM4Zjg0NTRhMThiYTE2N2RkY2U3MjY1NDJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiM2I0ZmVlMGVkMzRhMDk4Y2VmNjNhNDM5MTQ2Nzk4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMDAyNCw4LjUwODE2MTkyMzg4NDQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82M2Q0ZmFjMmIzMjY0MWE0YTNjZDhjMjM5NWZmMWYzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmYxYjMzMWFlMDc0ZmUzYTIyNDQ1MjIyYmI4YTBmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJmMWIzMzFhZTA3NGZlM2EyMjQ0NTIyMmJiOGEwZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJ1cmNraGFyZHBsYXRoQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYzZDRmYWMyYjMyNjQxYTRhM2NkOGMyMzk1ZmYxZjNiLnNldENvbnRlbnQoaHRtbF9iYmYxYjMzMWFlMDc0ZmUzYTIyNDQ1MjIyYmI4YTBmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYjNiNGZlZTBlZDM0YTA5OGNlZjYzYTQzOTE0Njc5OC5iaW5kUG9wdXAocG9wdXBfNjNkNGZhYzJiMzI2NDFhNGEzY2Q4YzIzOTVmZjFmM2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTE2NjU3ODg2ZWE0NDc0YTg5NmE1M2NlN2M0YTBiNGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTIyMTc0LDguNDgxNzE0NDkxMDE4Nzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NjAxMTJjOWNhYjQ0OTQ4YzAwMTZmZTEwNDcwYjcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiYTdiODc1MjlhMTQ2ZmU5YjYwMDIxMDk4M2RhN2RjID0gJCgnPGRpdiBpZD0iaHRtbF8wYmE3Yjg3NTI5YTE0NmZlOWI2MDAyMTA5ODNkYTdkYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a2xlbWVuczEwQG1hbmdvbGQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3NjAxMTJjOWNhYjQ0OTQ4YzAwMTZmZTEwNDcwYjcxLnNldENvbnRlbnQoaHRtbF8wYmE3Yjg3NTI5YTE0NmZlOWI2MDAyMTA5ODNkYTdkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTY2NTc4ODZlYTQ0NzRhODk2YTUzY2U3YzRhMGI0Yy5iaW5kUG9wdXAocG9wdXBfZDc2MDExMmM5Y2FiNDQ5NDhjMDAxNmZlMTA0NzBiNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTljNmEyNGE1MWRmNGY1NTg3ZmQxM2IyYWMxYjg4YjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDg0NjYsOC40ODQzNzE4OTgwMjAyMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZWRiNzI4ODc1NDk1NDgwNWIyY2JlNTljZjMzMzdjZTApOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjY4NDE4NjJkYmZhNGE5Yzg4YzRjNTlkYWNjODdiZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhkZGM1MWMxZTQxNGVkYmExNTdkODU4OWYwN2I1ZGUgPSAkKCc8ZGl2IGlkPSJodG1sXzc4ZGRjNTFjMWU0MTRlZGJhMTU3ZDg1ODlmMDdiNWRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hZGVsYmVydHNvbnRhZ0B0YWVzY2hlLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY4NDE4NjJkYmZhNGE5Yzg4YzRjNTlkYWNjODdiZDIuc2V0Q29udGVudChodG1sXzc4ZGRjNTFjMWU0MTRlZGJhMTU3ZDg1ODlmMDdiNWRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5YzZhMjRhNTFkZjRmNTU4N2ZkMTNiMmFjMWI4OGI0LmJpbmRQb3B1cChwb3B1cF8yNjg0MTg2MmRiZmE0YTljODhjNGM1OWRhY2M4N2JkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjkyZTkyMTlhNmI0ZDdmODJmNTdkMGE3MmZlYzJjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODc0ODQ5OTk5OTk5Niw4LjUxMDAyMzA3NTcyMjc4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjE1M2FjYzcxYTU0MWNhOTliODEwY2M1MDVjNzBlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYWNiY2E2NTgzN2Q0NDFkYjk2ZTg4MWExODA0ODI0YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWFjYmNhNjU4MzdkNDQxZGI5NmU4ODFhMTgwNDgyNGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJvZG8xNEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWIxNTNhY2M3MWE1NDFjYTk5YjgxMGNjNTA1YzcwZWIuc2V0Q29udGVudChodG1sX2VhY2JjYTY1ODM3ZDQ0MWRiOTZlODgxYTE4MDQ4MjRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyOTJlOTIxOWE2YjRkN2Y4MmY1N2QwYTcyZmVjMmM4LmJpbmRQb3B1cChwb3B1cF9lYjE1M2FjYzcxYTU0MWNhOTliODEwY2M1MDVjNzBlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYmUwNmIyMGNiNGI0ZTZlYjY0NjRkOWViMGM0ZWFmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTMxNDM1LDguNDkyMTA0NDE5NTM1NDgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlYWZiMGYxMTIxYTRmNzM4NDYyNzhmY2FjZTZlMTFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyY2FkN2U3N2JhMzQ0MjE4YjA4YzQyNzBkZTNiYWJkID0gJCgnPGRpdiBpZD0iaHRtbF81MmNhZDdlNzdiYTM0NDIxOGIwOGM0MjcwZGUzYmFiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2NobWlkdGdpbm9Acm9lbWVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZWFmYjBmMTEyMWE0ZjczODQ2Mjc4ZmNhY2U2ZTExZi5zZXRDb250ZW50KGh0bWxfNTJjYWQ3ZTc3YmEzNDQyMThiMDhjNDI3MGRlM2JhYmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWJlMDZiMjBjYjRiNGU2ZWI2NDY0ZDllYjBjNGVhZmYuYmluZFBvcHVwKHBvcHVwX2JlYWZiMGYxMTIxYTRmNzM4NDYyNzhmY2FjZTZlMTFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1YmZjZDNhYzk2OTQwMGE4NTZlOGRjNTBhYWJjM2ZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNDkxNCw4LjQ4NTM3OTE1NDIyMjI2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lZGI3Mjg4NzU0OTU0ODA1YjJjYmU1OWNmMzMzN2NlMCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWFhYmU0MjQxOTQ0M2YyOWJhYWUyZjBmMTI0MGE4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODVmNjUwN2Q4NGQ0MTVlYWQ2MjBiYzY0NzYyZDRlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg1ZjY1MDdkODRkNDE1ZWFkNjIwYmM2NDc2MmQ0ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmlzYWJlbGxqdW5rQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTVhYWJlNDI0MTk0NDNmMjliYWFlMmYwZjEyNDBhODMuc2V0Q29udGVudChodG1sXzU4NWY2NTA3ZDg0ZDQxNWVhZDYyMGJjNjQ3NjJkNGU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1YmZjZDNhYzk2OTQwMGE4NTZlOGRjNTBhYWJjM2ZjLmJpbmRQb3B1cChwb3B1cF85NWFhYmU0MjQxOTQ0M2YyOWJhYWUyZjBmMTI0MGE4Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NTZhMDM0NGQ0NDM0ZTc4OGRhZjAyYTYyN2QxNDYwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzA1ODYsOC41MDE5MjEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2VkYjcyODg3NTQ5NTQ4MDViMmNiZTU5Y2YzMzM3Y2UwKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3NTM5N2JiNjI5MjQ0YWU5MjA0ZTMzNTljYzJjMjk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmN2M5OTM0ZGM2ODQ0MWM4NmVjMDZlZjJhNDZkMjBkID0gJCgnPGRpdiBpZD0iaHRtbF8wZjdjOTkzNGRjNjg0NDFjODZlYzA2ZWYyYTQ2ZDIwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2VpdHplbGRhbmllbGFAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzc1Mzk3YmI2MjkyNDRhZTkyMDRlMzM1OWNjMmMyOTQuc2V0Q29udGVudChodG1sXzBmN2M5OTM0ZGM2ODQ0MWM4NmVjMDZlZjJhNDZkMjBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1NmEwMzQ0ZDQ0MzRlNzg4ZGFmMDJhNjI3ZDE0NjA2LmJpbmRQb3B1cChwb3B1cF8zNzUzOTdiYjYyOTI0NGFlOTIwNGUzMzU5Y2MyYzI5NCk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ 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 0x1a2502c910>" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create map of Zurich using the latitude and longitude values generated by geocoder\n", "map_folium = folium.Map(location=[custLatitude, custLongitude], zoom_start=15)\n", "\n", "# add a red cirle for the position of our customer to the map\n", "label = custAddr\n", "label = folium.Popup(label, parse_html=True)\n", "folium.CircleMarker(\n", " [custLatitude, custLongitude],\n", " radius=10,\n", " popup=label,\n", " color='red',\n", " parse_html=False).add_to(map_folium) \n", "\n", "# add smaller blue circles for helpers\n", "for email, lat, lng in zip(helperData['email'], helperData['latitude'], helperData['longitude']): \n", " label = email\n", " label = folium.Popup(label, parse_html=True)\n", " folium.CircleMarker(\n", " [lat, lng],\n", " radius=3,\n", " popup=label,\n", " color='blue',\n", " fill=True,\n", " fill_color='#1234cc',\n", " fill_opacity=0.7,\n", " parse_html=False).add_to(map_folium) \n", "\n", "map_folium" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Very nice. Let's hope that we have that many helpers in the real world." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### shops - get Foursquare location data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Right now we have a customer and possible helpers. But we still need positions of shops or restaurants where the helpers can fetch the goods and bring them to the customer. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For that will use realtime data we get by querying the Foursquare API. So we're finally done with fake data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First of all, we're gonna read the necessary Foursquare credentials and version **from the local File \"cred_foursquare.json\"**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "this json could resemble the following structure:\n", "```json\n", "{\n", " \"name\": \"Password JSON\",\n", " \"version\": \"1.0.0\",\n", " \"description\": \"\",\n", " \"command\": \"\",\n", " \"log\": \"\",\n", " \"location\": \"\",\n", " \"timeout\": \"0\",\n", " \"commandargs\": \"\",\n", " \"keys\":\n", " [\n", " {\n", " \"scriptkey\": \"VERSION\",\n", " \"scriptvalue\": \"20180605\",\n", " \"scriptdefaultvalue\": \"\"\n", " },\n", " {\n", " \"scriptkey\": \"ID\",\n", " \"scriptvalue\": \"***************************\"\n", " \"scriptdefaultvalue\": \"\"\n", " },\n", " {\n", " \"scriptkey\": \"SECRET\",\n", " \"scriptvalue\": \"***************************\",\n", " \"scriptdefaultvalue\": \"\",\n", " \"type\": \"password\"\n", " }\n", " ]\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ID and SECRET can be obtained for free on https://developer.foursquare.com/ by registering for a free developer account.\n", "\n", "After saving the credentials in the file \"cred_foursquare.json\" we can load the values into variables." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "cred=pd.read_json(r'cred_foursquare.json') # read the json file" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "VERSION=cred['keys'][0]['scriptvalue'] # Foursquare API version\n", "CLIENT_ID=cred['keys'][1]['scriptvalue'] # Foursquare ID\n", "CLIENT_SECRET=cred['keys'][2]['scriptvalue'] # Foursquare Secret\n", "LIMIT=100 # max number of answers because number of queries on the free account are limited" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's think about __what type of venues__ we want to include as possible shops / restaurants \n", "\n", "Everybody can have a look at all of Foursquare's venue categories and the corresponding IDs that can be queried with the API:\n", "https://developer.foursquare.com/docs/build-with-foursquare/categories/\n", "\n", "__I'll go with the following in this case:__\n", "\n", "- Food\n", "4d4b7105d754a06374d81259\n", "\n", "- Food & Drink Shop\n", "4bf58dd8d48988d1f9941735\n", "\n", "- Fruit & Vegetable Store\n", "52f2ab2ebcbc57f1066b8b1c\n", "\n", "- Market\n", "50be8ee891d4fa8dcc7199a7\n", "\n", "- Pharmacy\n", "4bf58dd8d48988d10f951735\n", "\n", "- Shopping Mall\n", "4bf58dd8d48988d1fd941735\n", "\n", "\n", "Of course there would also be a possibility to query for much more specific kinds of restaurants, e.g. a\n", "Vegetarian / Vegan Restaurant\n", "4bf58dd8d48988d1d3941735\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get going, we first __define a function that queries the Foursquare API and returns nearby venues__." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "def getNearbyVenues(names, latitudes, longitudes, radius, categories): # function adapted from course script\n", " \n", " venues_list=[]\n", " for name, lat, lng in zip(names, latitudes, longitudes):\n", " print('Searching venues for',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={}&categoryId={}'.format(\n", " CLIENT_ID, \n", " CLIENT_SECRET, \n", " VERSION, \n", " lat, \n", " lng, \n", " radius, \n", " LIMIT,\n", " categories)\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 = ['Customer Email', \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 that we have the function in place, let's use it to query for the venues that are close to our customer.\n", "\n", "For the radius, let's just assume a reasonable number: A normal healthy young human walks at about 4 km/h by foot. So in 15 minutes the helper would travel 1 kilometer (=1000 meters). That's a reasonable number in a City like Zurich, where one has plenty of shopping possibilites. In rural areas one would probably consider cars as the transport way of choice and would also need to apply a larger radius.\n", "\n", "For here, 1000 meters should be fine." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Searching venues for hungrycustomer1942@bluewin.ch\n" ] }, { "data": { "text/plain": [ "(12, 7)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "venues = getNearbyVenues(names=['hungrycustomer1942@bluewin.ch'],\n", " latitudes=[custLatitude],\n", " longitudes=[custLongitude],\n", " radius=1000,\n", " categories='4d4b7105d754a06374d81259,4bf58dd8d48988d1f9941735,52f2ab2ebcbc57f1066b8b1c,50be8ee891d4fa8dcc7199a7,4bf58dd8d48988d10f951735,4bf58dd8d48988d1fd941735'\n", " )\n", "venues.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So in our customers case we were able to find 12 venues nearby (in the radius of 1000 meters)." ] }, { "cell_type": "code", "execution_count": 29, "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>Customer Email</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>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Kebab-Haus Höngg</td>\n", " <td>47.402172</td>\n", " <td>8.495997</td>\n", " <td>Fast Food Restaurant</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Desperado</td>\n", " <td>47.402083</td>\n", " <td>8.496903</td>\n", " <td>Mexican Restaurant</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Argentina Steakhouse</td>\n", " <td>47.403935</td>\n", " <td>8.496524</td>\n", " <td>Steakhouse</td>\n", " </tr>\n", " <tr>\n", " <th>3</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Osteria da Biagio</td>\n", " <td>47.402264</td>\n", " <td>8.495558</td>\n", " <td>Italian Restaurant</td>\n", " </tr>\n", " <tr>\n", " <th>4</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Pizzeria Rapido</td>\n", " <td>47.401672</td>\n", " <td>8.499121</td>\n", " <td>Pizza Place</td>\n", " </tr>\n", " <tr>\n", " <th>5</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Marcello's Bistro</td>\n", " <td>47.403001</td>\n", " <td>8.498206</td>\n", " <td>Café</td>\n", " </tr>\n", " <tr>\n", " <th>6</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Restaurant Turbinenhaus</td>\n", " <td>47.395374</td>\n", " <td>8.505774</td>\n", " <td>Italian Restaurant</td>\n", " </tr>\n", " <tr>\n", " <th>7</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Del Sole Pizzakurier Höngg</td>\n", " <td>47.400281</td>\n", " <td>8.503689</td>\n", " <td>Pizza Place</td>\n", " </tr>\n", " <tr>\n", " <th>8</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Maharani</td>\n", " <td>47.402779</td>\n", " <td>8.492496</td>\n", " <td>Indian Restaurant</td>\n", " </tr>\n", " <tr>\n", " <th>9</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>Restaurant Werdinsel</td>\n", " <td>47.399353</td>\n", " <td>8.489361</td>\n", " <td>Snack Place</td>\n", " </tr>\n", " <tr>\n", " <th>10</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>ETH Chemiecafeteria</td>\n", " <td>47.408014</td>\n", " <td>8.507681</td>\n", " <td>Café</td>\n", " </tr>\n", " <tr>\n", " <th>11</th>\n", " <td>hungrycustomer1942@bluewin.ch</td>\n", " <td>47.402884</td>\n", " <td>8.499581</td>\n", " <td>SV Bistro Hönggerberg</td>\n", " <td>47.408312</td>\n", " <td>8.507627</td>\n", " <td>Café</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Customer Email Neighborhood Latitude \\\n", "0 hungrycustomer1942@bluewin.ch 47.402884 \n", "1 hungrycustomer1942@bluewin.ch 47.402884 \n", "2 hungrycustomer1942@bluewin.ch 47.402884 \n", "3 hungrycustomer1942@bluewin.ch 47.402884 \n", "4 hungrycustomer1942@bluewin.ch 47.402884 \n", "5 hungrycustomer1942@bluewin.ch 47.402884 \n", "6 hungrycustomer1942@bluewin.ch 47.402884 \n", "7 hungrycustomer1942@bluewin.ch 47.402884 \n", "8 hungrycustomer1942@bluewin.ch 47.402884 \n", "9 hungrycustomer1942@bluewin.ch 47.402884 \n", "10 hungrycustomer1942@bluewin.ch 47.402884 \n", "11 hungrycustomer1942@bluewin.ch 47.402884 \n", "\n", " Neighborhood Longitude Venue Venue Latitude \\\n", "0 8.499581 Kebab-Haus Höngg 47.402172 \n", "1 8.499581 Desperado 47.402083 \n", "2 8.499581 Argentina Steakhouse 47.403935 \n", "3 8.499581 Osteria da Biagio 47.402264 \n", "4 8.499581 Pizzeria Rapido 47.401672 \n", "5 8.499581 Marcello's Bistro 47.403001 \n", "6 8.499581 Restaurant Turbinenhaus 47.395374 \n", "7 8.499581 Del Sole Pizzakurier Höngg 47.400281 \n", "8 8.499581 Maharani 47.402779 \n", "9 8.499581 Restaurant Werdinsel 47.399353 \n", "10 8.499581 ETH Chemiecafeteria 47.408014 \n", "11 8.499581 SV Bistro Hönggerberg 47.408312 \n", "\n", " Venue Longitude Venue Category \n", "0 8.495997 Fast Food Restaurant \n", "1 8.496903 Mexican Restaurant \n", "2 8.496524 Steakhouse \n", "3 8.495558 Italian Restaurant \n", "4 8.499121 Pizza Place \n", "5 8.498206 Café \n", "6 8.505774 Italian Restaurant \n", "7 8.503689 Pizza Place \n", "8 8.492496 Indian Restaurant \n", "9 8.489361 Snack Place \n", "10 8.507681 Café \n", "11 8.507627 Café " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "venues" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now how about we create a **function** we can reuse to **display a map of all three parties (customer, helpers, shops) together**:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "scrolled": true }, "outputs": [], "source": [ "def createRawMap(custLatitude, custLongitude, custAddr, helperData, venues, zoomStart=15):\n", "\n", " # create map of Zurich using the latitude and longitude values generated by geocoder\n", " map_folium = folium.Map(location=[custLatitude, custLongitude], zoom_start=zoomStart)\n", "\n", " # add a red cirle for the position of our customer to the map\n", " label = custAddr\n", " label = folium.Popup(label, parse_html=True)\n", " folium.CircleMarker(\n", " [custLatitude, custLongitude],\n", " radius=10,\n", " popup=label,\n", " color='red',\n", " parse_html=False).add_to(map_folium) \n", "\n", "\n", " # add smaller blue circles for helpers\n", " for email, lat, lng in zip(helperData['email'], helperData['latitude'], helperData['longitude']): \n", " label = email\n", " label = folium.Popup(label, parse_html=True)\n", " folium.CircleMarker(\n", " [lat, lng],\n", " radius=3,\n", " popup=label,\n", " color='blue',\n", " fill=True,\n", " fill_color='#1234cc',\n", " fill_opacity=0.7,\n", " parse_html=False).add_to(map_folium) \n", "\n", " # add smaller green circles for helpers\n", " for venue, lat, lng in zip(venues['Venue'], venues['Venue Latitude'], venues['Venue Longitude']): \n", " label = venue\n", " label = folium.Popup(label, parse_html=True)\n", " folium.CircleMarker(\n", " [lat, lng],\n", " radius=3,\n", " popup=label,\n", " color='green',\n", " fill=True,\n", " fill_color='#90ee90',\n", " fill_opacity=0.7,\n", " parse_html=False).add_to(map_folium)\n", " \n", " return map_folium" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and see if it works:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><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+ICNtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfMzk2MmY0MWYyM2VlNGY3Yjk3NTBmMDM4MjRjMTk5NGMgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwNGUxMjUyNTc2NzQwNjI5ZTBiMzFhNWRhYjFkMzk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyODgzOSw4LjQ5OTU4MDg0NzcyNjAyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Yjk4ZGNjMjVkNTI0OGJkODI5MjBkY2VmOWYyYzQ0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YjhiMzE3YTAyNDA0YTJiODc4Yzg0YTgxM2E2ZDg4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGI4YjMxN2EwMjQwNGEyYjg3OGM4NGE4MTNhNmQ4OGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdzdGVpZ3N0cmFzc2UgOSwgODA0OSBadXJpY2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiOThkY2MyNWQ1MjQ4YmQ4MjkyMGRjZWY5ZjJjNDQ3LnNldENvbnRlbnQoaHRtbF84YjhiMzE3YTAyNDA0YTJiODc4Yzg0YTgxM2E2ZDg4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMDRlMTI1MjU3Njc0MDYyOWUwYjMxYTVkYWIxZDM5NS5iaW5kUG9wdXAocG9wdXBfNmI5OGRjYzI1ZDUyNDhiZDgyOTIwZGNlZjlmMmM0NDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWIzMjY3NzZjNmM1NGU3OTg0MzAwNTg1OGM0NjlhNTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQ1ODgyLDguNDk1Njk5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzUwYjdhZjhmNGI0MzQzYTMzYjlkMDllOGRmYWQ5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZjQ4ZWZmZTk5MDA0MTBiYjVmOWY0YWY0MDJlNjg4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWY0OGVmZmU5OTAwNDEwYmI1ZjlmNGFmNDAyZTY4ODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm9sZW5hMjNAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzUwYjdhZjhmNGI0MzQzYTMzYjlkMDllOGRmYWQ5NS5zZXRDb250ZW50KGh0bWxfYWY0OGVmZmU5OTAwNDEwYmI1ZjlmNGFmNDAyZTY4ODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWIzMjY3NzZjNmM1NGU3OTg0MzAwNTg1OGM0NjlhNTQuYmluZFBvcHVwKHBvcHVwX2Y3NTBiN2FmOGY0YjQzNDNhMzNiOWQwOWU4ZGZhZDk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1ZDRhNWQ1YzlhZjRmZmI4YjRlOTE5NzZjZDY4ZTQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2ODMzNSw4LjQ4NjM2NDc4ODMzNjQ3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTU5YWRhNmZiZDI0MDRjYmJkZjQzMmI3NmFhNmZkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84M2UzOTVjMDMyMjk0MWJlOTdiMDExNDAzNDY4ZGUzMyA9ICQoJzxkaXYgaWQ9Imh0bWxfODNlMzk1YzAzMjI5NDFiZTk3YjAxMTQwMzQ2OGRlMzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFiZHVsMzdAbG9yY2guZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5NTlhZGE2ZmJkMjQwNGNiYmRmNDMyYjc2YWE2ZmRkLnNldENvbnRlbnQoaHRtbF84M2UzOTVjMDMyMjk0MWJlOTdiMDExNDAzNDY4ZGUzMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNWQ0YTVkNWM5YWY0ZmZiOGI0ZTkxOTc2Y2Q2OGU0OS5iaW5kUG9wdXAocG9wdXBfODk1OWFkYTZmYmQyNDA0Y2JiZGY0MzJiNzZhYTZmZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDFiNWExNjk1NzdmNDkxMmFjNmNiZTNmYmE3NTUxOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDE4MTg4OTk5OTk5OTUsOC41MDI5MDQxMDk3NDczNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDhkMzY1NjA1ZjQ3NGFkNWIyZGQ3MWQ2NzlmMDg0ZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI4MTFjNDM5YjcxNGE5NWI4OTYzNGFkMzg1ZjBmMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzBiODExYzQzOWI3MTRhOTViODk2MzRhZDM4NWYwZjFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yb24wNkBldHpsZXIub3JnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOGQzNjU2MDVmNDc0YWQ1YjJkZDcxZDY3OWYwODRkMy5zZXRDb250ZW50KGh0bWxfMGI4MTFjNDM5YjcxNGE5NWI4OTYzNGFkMzg1ZjBmMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDFiNWExNjk1NzdmNDkxMmFjNmNiZTNmYmE3NTUxOGMuYmluZFBvcHVwKHBvcHVwX2Q4ZDM2NTYwNWY0NzRhZDViMmRkNzFkNjc5ZjA4NGQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkY2Q1OWExMmE0ZDRiMTBhZjBiZDcwZTQ3MjI0NzBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzOTM2Miw4LjQ3NzgyNDQyOTQ3NTQ2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYWE1OGJhNjliYzE0NGM1YjdmZDAzZGU5N2FhNmU0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTZhNzhiOGQyMzQ0NDE1YjQ5NzdhOTc5YTVhNTk5NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDE2YTc4YjhkMjM0NDQxNWI0OTc3YTk3OWE1YTU5OTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0YW5pc2xhdzExQGdvcmxpdHouY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYWE1OGJhNjliYzE0NGM1YjdmZDAzZGU5N2FhNmU0NS5zZXRDb250ZW50KGh0bWxfNDE2YTc4YjhkMjM0NDQxNWI0OTc3YTk3OWE1YTU5OTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmRjZDU5YTEyYTRkNGIxMGFmMGJkNzBlNDcyMjQ3MGYuYmluZFBvcHVwKHBvcHVwXzFhYTU4YmE2OWJjMTQ0YzViN2ZkMDNkZTk3YWE2ZTQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzNmYzOGExYzY0MTQ1YWY5NGZhOWU0MmQ5MmZhMjk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA1Mjc4NDk5OTk5OTk0LDguNTAwNjUzNDQ5OTk5OTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNTU2NGQzYWVkYTQ1ZmNiZTE3NDFhYTliOGNjZDIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1ZjMxZjIwZTRhMjQ1NDQ5NWJkYTliZmVkMzBmZDg5ID0gJCgnPGRpdiBpZD0iaHRtbF9mNWYzMWYyMGU0YTI0NTQ0OTViZGE5YmZlZDMwZmQ4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZG9ybGVib2VybmVyQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTE1NTY0ZDNhZWRhNDVmY2JlMTc0MWFhOWI4Y2NkMjMuc2V0Q29udGVudChodG1sX2Y1ZjMxZjIwZTRhMjQ1NDQ5NWJkYTliZmVkMzBmZDg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzNmYzOGExYzY0MTQ1YWY5NGZhOWU0MmQ5MmZhMjk2LmJpbmRQb3B1cChwb3B1cF9lMTU1NjRkM2FlZGE0NWZjYmUxNzQxYWE5YjhjY2QyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjJhOGJmOWRjNzE0ODg4OTRlZGRiNGY0ZTliNTFjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDcwMTYsOC40OTIwODM5NTA4NjUzODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmVkNzJkNzI1MThmNGQ1NThlMGI4NDFhZDlmYjgzMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmZiNzQyNWFjNjUyNDZjZmFhZjI5MDZlMDg5MmIyNmYgPSAkKCc8ZGl2IGlkPSJodG1sXzZmYjc0MjVhYzY1MjQ2Y2ZhYWYyOTA2ZTA4OTJiMjZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ua3JhdXNlQHJlaW5oYXJkdC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlZDcyZDcyNTE4ZjRkNTU4ZTBiODQxYWQ5ZmI4MzFmLnNldENvbnRlbnQoaHRtbF82ZmI3NDI1YWM2NTI0NmNmYWFmMjkwNmUwODkyYjI2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjJhOGJmOWRjNzE0ODg4OTRlZGRiNGY0ZTliNTFjOC5iaW5kUG9wdXAocG9wdXBfNmVkNzJkNzI1MThmNGQ1NThlMGI4NDFhZDlmYjgzMWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2IyYjU3ZWRhMmE0NDdlYzhlYTAzOWM3MzVmZjRlMDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDc3MDQzLDguNDg1MDcwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYzgyYmYxNmJlZDE0YTZhOTYyNTY3ZmRjZjlkYWRhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjNhMWM1MzU4OGI0ZTAwOWEwOTM0MTY0MmQwOTczNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNWYzYTFjNTM1ODhiNGUwMDlhMDkzNDE2NDJkMDk3MzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmpvZXJnZW42OEBoZXVzZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjODJiZjE2YmVkMTRhNmE5NjI1NjdmZGNmOWRhZGEzLnNldENvbnRlbnQoaHRtbF81ZjNhMWM1MzU4OGI0ZTAwOWEwOTM0MTY0MmQwOTczNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYjJiNTdlZGEyYTQ0N2VjOGVhMDM5YzczNWZmNGUwMi5iaW5kUG9wdXAocG9wdXBfMGM4MmJmMTZiZWQxNGE2YTk2MjU2N2ZkY2Y5ZGFkYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzdmYjA3ZTgxMjg0NGQ1ZGI2MzY4ZjJkNmU0ZDExYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMxMTcsOC40OTM2ODE4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxMjkzYWE0NmZiODRkNjRhOThmNjlkODc3ZTk1ODc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzYWY3NjZkODY0ZTQzZTc4ZmZjYWI0MTJhOTc0MTI4ID0gJCgnPGRpdiBpZD0iaHRtbF9hM2FmNzY2ZDg2NGU0M2U3OGZmY2FiNDEyYTk3NDEyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3VzY2hrYXJsLWF1Z3VzdEBob2x6YXBmZWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MxMjkzYWE0NmZiODRkNjRhOThmNjlkODc3ZTk1ODc0LnNldENvbnRlbnQoaHRtbF9hM2FmNzY2ZDg2NGU0M2U3OGZmY2FiNDEyYTk3NDEyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zN2ZiMDdlODEyODQ0ZDVkYjYzNjhmMmQ2ZTRkMTFiYy5iaW5kUG9wdXAocG9wdXBfYzEyOTNhYTQ2ZmI4NGQ2NGE5OGY2OWQ4NzdlOTU4NzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjVhOGJiMjY1MTE1NDU0YzhkYzdiYzJhYWZjOGEzYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDZmMTkzYjFjNDE0N2FhYmJkODQzZWI2MDllNDdkNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDFlYzljNzZiOTQ0NTJmOWNmMmRkOTBjYmU5M2ZjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDAxZWM5Yzc2Yjk0NDUyZjljZjJkZDkwY2JlOTNmY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1ldGluMzRAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMDZmMTkzYjFjNDE0N2FhYmJkODQzZWI2MDllNDdkNy5zZXRDb250ZW50KGh0bWxfNDAxZWM5Yzc2Yjk0NDUyZjljZjJkZDkwY2JlOTNmY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjVhOGJiMjY1MTE1NDU0YzhkYzdiYzJhYWZjOGEzYjYuYmluZFBvcHVwKHBvcHVwX2IwNmYxOTNiMWM0MTQ3YWFiYmQ4NDNlYjYwOWU0N2Q3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmOTdkYzg0YzBiNDRiYjk5ZDJmN2QyNDJmNzA2OWNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMzg1OCw4LjUwOTQwNjA1MTc4Nzg0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYmM3OTM1NWRjMzc0ZDk5YTE1MzU0NDQ0NjMyOGI5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNWFmNWIyMGIwOTU0NGQ0OGIyY2Y4ODcyYmY5Y2Q4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDVhZjViMjBiMDk1NDRkNDhiMmNmODg3MmJmOWNkODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1hcmljYWp1bmNrQG5ldXNjaGFlZmVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYmM3OTM1NWRjMzc0ZDk5YTE1MzU0NDQ0NjMyOGI5NC5zZXRDb250ZW50KGh0bWxfZDVhZjViMjBiMDk1NDRkNDhiMmNmODg3MmJmOWNkODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWY5N2RjODRjMGI0NGJiOTlkMmY3ZDI0MmY3MDY5Y2IuYmluZFBvcHVwKHBvcHVwX2FiYzc5MzU1ZGMzNzRkOTlhMTUzNTQ0NDQ2MzI4Yjk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y2Mjk3OTIzZjQwZjQ2MGZhZTU0OGE1ODM1YmVmMWM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NTEyMDQ5OTk5OTk0LDguNTExMTQ0NDQzOTY3MzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2OGI1MWYzZDJmOTQ5Y2FhZGI0YTY3YzFhZWEzMzU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0MDMzMmU1Y2MzNTRiMjZhYjI4OWJlZjI2ZTg1YjI3ID0gJCgnPGRpdiBpZD0iaHRtbF80NDAzMzJlNWNjMzU0YjI2YWIyODliZWYyNmU4NWIyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWJvaGxhbmRlckBzZWlmZXJ0LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjhiNTFmM2QyZjk0OWNhYWRiNGE2N2MxYWVhMzM1OS5zZXRDb250ZW50KGh0bWxfNDQwMzMyZTVjYzM1NGIyNmFiMjg5YmVmMjZlODViMjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjYyOTc5MjNmNDBmNDYwZmFlNTQ4YTU4MzViZWYxYzcuYmluZFBvcHVwKHBvcHVwX2E2OGI1MWYzZDJmOTQ5Y2FhZGI0YTY3YzFhZWEzMzU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1YWU1ZDEzN2JkNTQyYjc5NDMyODliZmQ2YTc3YWRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MjQxOTUsOC40OTM0OTIyMTQyNDk0MDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjk0MTYzMzQ2ODc1NDVlZjliYTU5ZTRhMzA1Y2UyYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzM1NjlhNmRkM2IwNDU3MmFkNWViNjAwMTBmZDY4OGQgPSAkKCc8ZGl2IGlkPSJodG1sXzMzNTY5YTZkZDNiMDQ1NzJhZDVlYjYwMDEwZmQ2ODhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGlmZmVsZG9uYWxkQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOTQxNjMzNDY4NzU0NWVmOWJhNTllNGEzMDVjZTJiNC5zZXRDb250ZW50KGh0bWxfMzM1NjlhNmRkM2IwNDU3MmFkNWViNjAwMTBmZDY4OGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDVhZTVkMTM3YmQ1NDJiNzk0MzI4OWJmZDZhNzdhZGQuYmluZFBvcHVwKHBvcHVwXzI5NDE2MzM0Njg3NTQ1ZWY5YmE1OWU0YTMwNWNlMmI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxM2YwYjk4YjFmOTRkNDlhN2M4MDQ4NGU2OTUzNzgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAxNTE3ODUwMDAwMDA1LDguNTA3ODMxMDM0MDY0ODRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTExZDdkOGRiZTU5NGQwZjliZTYzNjRlMjUxNDc4OTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM2MzUzN2NmYWI0NGZkMGE0ZDdkOTY0YmE1ZGE1MWIgPSAkKCc8ZGl2IGlkPSJodG1sXzUzNjM1MzdjZmFiNDRmZDBhNGQ3ZDk2NGJhNWRhNTFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56cnVwcGVydEBsb2V3ZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExMWQ3ZDhkYmU1OTRkMGY5YmU2MzY0ZTI1MTQ3ODkwLnNldENvbnRlbnQoaHRtbF81MzYzNTM3Y2ZhYjQ0ZmQwYTRkN2Q5NjRiYTVkYTUxYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMTNmMGI5OGIxZjk0ZDQ5YTdjODA0ODRlNjk1Mzc4MC5iaW5kUG9wdXAocG9wdXBfMTExZDdkOGRiZTU5NGQwZjliZTYzNjRlMjUxNDc4OTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzVmNDQ3MjQzZDU0NDczY2I1ZTU3ZjBmM2FmMGQ5YTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1OTEzLDguNTA3MjM3NzM4NDgyMDU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2MGI1MTNhZmNiMTQ4NGU5NDNmZWNmYjRhYjNhMDY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2ZTFlZjdmNzk0MTQ5YjNhYTM5OTQ3YTBjODVkM2I2ID0gJCgnPGRpdiBpZD0iaHRtbF9kNmUxZWY3Zjc5NDE0OWIzYWEzOTk0N2EwYzg1ZDNiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cmFsZi1kaWV0ZXJrcmV1c2VsQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODYwYjUxM2FmY2IxNDg0ZTk0M2ZlY2ZiNGFiM2EwNjQuc2V0Q29udGVudChodG1sX2Q2ZTFlZjdmNzk0MTQ5YjNhYTM5OTQ3YTBjODVkM2I2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM1ZjQ0NzI0M2Q1NDQ3M2NiNWU1N2YwZjNhZjBkOWE3LmJpbmRQb3B1cChwb3B1cF84NjBiNTEzYWZjYjE0ODRlOTQzZmVjZmI0YWIzYTA2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YmJmNzYxYmI0NTM0NTBiOThhMjUzNjY4NTY2ODAyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDgzMzYsOC41MDIxNDYwMDE4NjQyNzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQyNzk3YzM2NDY4NGY0ZDk0ZjkxNjg3YzliMjI0ZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjJlZDU0YTBhZGRhNDZmMDg3NjgxNDdiM2YyM2U0ZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2IyZWQ1NGEwYWRkYTQ2ZjA4NzY4MTQ3YjNmMjNlNGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5iYXJraG9senZhbGVudGluZUBiYXJ0aC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGQyNzk3YzM2NDY4NGY0ZDk0ZjkxNjg3YzliMjI0ZWMuc2V0Q29udGVudChodG1sX2IyZWQ1NGEwYWRkYTQ2ZjA4NzY4MTQ3YjNmMjNlNGUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliYmY3NjFiYjQ1MzQ1MGI5OGEyNTM2Njg1NjY4MDJhLmJpbmRQb3B1cChwb3B1cF8wZDI3OTdjMzY0Njg0ZjRkOTRmOTE2ODdjOWIyMjRlYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NTM5ZTViYmE0MTg0NzFjYWEwM2E5MDM0YWQyZTljMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjYyODUwMDAwMDAwNiw4LjUwNTY1NjA0ODk5MDcwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MzE5MjA1YzE5NWY0ZTUzYmIwMmIwYTRhZDgwNjY5YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZjMxYzE2YzkzZWM0YjgxODExMmNlMDc0NDk3ZDIzMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNWYzMWMxNmM5M2VjNGI4MTgxMTJjZTA3NDQ5N2QyMzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFuaWthMzhAcm9odC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczMTkyMDVjMTk1ZjRlNTNiYjAyYjBhNGFkODA2NjlhLnNldENvbnRlbnQoaHRtbF81ZjMxYzE2YzkzZWM0YjgxODExMmNlMDc0NDk3ZDIzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NTM5ZTViYmE0MTg0NzFjYWEwM2E5MDM0YWQyZTljMi5iaW5kUG9wdXAocG9wdXBfNzMxOTIwNWMxOTVmNGU1M2JiMDJiMGE0YWQ4MDY2OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDZiM2NmZWNjZGU2NGM5YmJkMWUwNjJmNGYyMjFmZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZDI2NGYxNzMyZDY0MDA2OWNiNDg3YTkzMmQzZTdmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjM1MDlmMGYwYTY0YzQ0YTQwMDg2MDY1ODI3ZGZhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfODIzNTA5ZjBmMGE2NGM0NGE0MDA4NjA2NTgyN2RmYTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmVob2VybGVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDI2NGYxNzMyZDY0MDA2OWNiNDg3YTkzMmQzZTdmZS5zZXRDb250ZW50KGh0bWxfODIzNTA5ZjBmMGE2NGM0NGE0MDA4NjA2NTgyN2RmYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDZiM2NmZWNjZGU2NGM5YmJkMWUwNjJmNGYyMjFmZWEuYmluZFBvcHVwKHBvcHVwX2ZkMjY0ZjE3MzJkNjQwMDY5Y2I0ODdhOTMyZDNlN2ZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExYmNjOTQ5NjI4MzQ0OTc4MjAyOTRhZDNmZjU2MjdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MDU2MTUsOC40OTUzNzU4MDI4NTY3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NWU0NGVlOGQ2YjU0YWExYTE4YjgwOTk3ZWU0ZmNmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMDJkZjhkZjBmZDQ0YTk3YjAwMTgwOGNjNmVjNTgyNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjAyZGY4ZGYwZmQ0NGE5N2IwMDE4MDhjYzZlYzU4MjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFubmVsaTA1QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjVlNDRlZThkNmI1NGFhMWExOGI4MDk5N2VlNGZjZjEuc2V0Q29udGVudChodG1sXzIwMmRmOGRmMGZkNDRhOTdiMDAxODA4Y2M2ZWM1ODI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExYmNjOTQ5NjI4MzQ0OTc4MjAyOTRhZDNmZjU2MjdmLmJpbmRQb3B1cChwb3B1cF82NWU0NGVlOGQ2YjU0YWExYTE4YjgwOTk3ZWU0ZmNmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZGZlNDlhZWUwOTY0OTVhOGE3MmY0YzhmNzc3YTA2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDM5MzY5OTk5OTk5NSw4LjQ5MDAxOTc3NjIyODQxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDdhZDQ3N2ZlZTc0NmUxODk2MThjNWUyODM1YzJlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NGMzMDY4ZmViZGQ0ZTg2Yjk4MmVhNzc0YzAzOWYwZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDRjMzA2OGZlYmRkNGU4NmI5ODJlYTc3NGMwMzlmMGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnpyaXR0ZXJAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDdhZDQ3N2ZlZTc0NmUxODk2MThjNWUyODM1YzJlMi5zZXRDb250ZW50KGh0bWxfNDRjMzA2OGZlYmRkNGU4NmI5ODJlYTc3NGMwMzlmMGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRmZTQ5YWVlMDk2NDk1YThhNzJmNGM4Zjc3N2EwNjUuYmluZFBvcHVwKHBvcHVwXzcwN2FkNDc3ZmVlNzQ2ZTE4OTYxOGM1ZTI4MzVjMmUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzYjEwMzQ3MWRiYzQ1ZjY4ZjhjM2E3NTg3YTkwOTRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTc3NDUsOC40OTgzMjAwODA3Njg3MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVkMjYxNzlkZDdiNGU4ZDhhMjhmODVkZjk5YTI5YjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWVkZDdkNzcwZmM3NDAyOGEyMTM3MmM5NzBjYzBmODMgPSAkKCc8ZGl2IGlkPSJodG1sX2FlZGQ3ZDc3MGZjNzQwMjhhMjEzNzJjOTcwY2MwZjgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5iYmFjaG1hbm5Ad2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZWQyNjE3OWRkN2I0ZThkOGEyOGY4NWRmOTlhMjliNC5zZXRDb250ZW50KGh0bWxfYWVkZDdkNzcwZmM3NDAyOGEyMTM3MmM5NzBjYzBmODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTNiMTAzNDcxZGJjNDVmNjhmOGMzYTc1ODdhOTA5NGUuYmluZFBvcHVwKHBvcHVwX2ZlZDI2MTc5ZGQ3YjRlOGQ4YTI4Zjg1ZGY5OWEyOWI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjMTNkODNiNGUyNjRlYzg5NGQ2OWQxNjIwZTJhNjJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2NjUzNjQ5OTk5OTk2LDguNDkzNDY0MTYzNjAwNjI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjNTYzY2U3OGZmYzQ0ZWNiMThkODY1NDFkZDM5OWFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiNjkxOTU1ZTNkOTQyMDFhYzBiZTNkODAwNGFkZGJmID0gJCgnPGRpdiBpZD0iaHRtbF8xYjY5MTk1NWUzZDk0MjAxYWMwYmUzZDgwMDRhZGRiZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWhlc2VyQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGM1NjNjZTc4ZmZjNDRlY2IxOGQ4NjU0MWRkMzk5YWEuc2V0Q29udGVudChodG1sXzFiNjkxOTU1ZTNkOTQyMDFhYzBiZTNkODAwNGFkZGJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjMTNkODNiNGUyNjRlYzg5NGQ2OWQxNjIwZTJhNjJiLmJpbmRQb3B1cChwb3B1cF8wYzU2M2NlNzhmZmM0NGVjYjE4ZDg2NTQxZGQzOTlhYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OWMwNGVmYTg5YTM0NjY0YmQ2NTg4MzYyYWIyNzJlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODQ3NDA1MDAwMDAwNCw4LjUxMTU2MjU0NzE4NzA4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNmU0NTEyMGNkZGU0MmJiOTgyNGExMjdmNmRjMjM3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iN2EzMGI4ODgzM2M0YzM3YjZmMTYyYTkyOGUxOTNmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjdhMzBiODg4MzNjNGMzN2I2ZjE2MmE5MjhlMTkzZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnFub2Fja0Bob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmU0NTEyMGNkZGU0MmJiOTgyNGExMjdmNmRjMjM3ZS5zZXRDb250ZW50KGh0bWxfYjdhMzBiODg4MzNjNGMzN2I2ZjE2MmE5MjhlMTkzZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTljMDRlZmE4OWEzNDY2NGJkNjU4ODM2MmFiMjcyZWEuYmluZFBvcHVwKHBvcHVwX2E2ZTQ1MTIwY2RkZTQyYmI5ODI0YTEyN2Y2ZGMyMzdlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkY2ZmMmRlNWMyZDRmNmZiNTE0ZTYxOTQxNjA2NGJmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQxY2QyNDA2YWJjNDRlMzlhYzAzYzdhY2ZjZDRkNjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmVmOWM2MTNlMjNiNGM4MGFlZTI5NzgwYTMxNmQ1OTIgPSAkKCc8ZGl2IGlkPSJodG1sX2JlZjljNjEzZTIzYjRjODBhZWUyOTc4MGEzMTZkNTkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5qb3NlZjk1QGJvZXJuZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDFjZDI0MDZhYmM0NGUzOWFjMDNjN2FjZmNkNGQ2MC5zZXRDb250ZW50KGh0bWxfYmVmOWM2MTNlMjNiNGM4MGFlZTI5NzgwYTMxNmQ1OTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRjZmYyZGU1YzJkNGY2ZmI1MTRlNjE5NDE2MDY0YmYuYmluZFBvcHVwKHBvcHVwX2Y0MWNkMjQwNmFiYzQ0ZTM5YWMwM2M3YWNmY2Q0ZDYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5MjAxZjllMDZiOTQyMGI5N2UzYjc2NWFjYmMwMjQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MjQ1MjUsOC40OTIzMTY5OTIyOTQ0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMTk3NDAyODkyMGE0ODM4OTcxZmI2ZDk1NjY4NGE1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYzg1ZDNlOTc3ZTY0Y2I0OWIxNzZmNjYxZmMwODg0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2M4NWQzZTk3N2U2NGNiNDliMTc2ZjY2MWZjMDg4NDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1laW5oYXJkYm9sem1hbm5Ad2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTk3NDAyODkyMGE0ODM4OTcxZmI2ZDk1NjY4NGE1YS5zZXRDb250ZW50KGh0bWxfY2M4NWQzZTk3N2U2NGNiNDliMTc2ZjY2MWZjMDg4NDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDkyMDFmOWUwNmI5NDIwYjk3ZTNiNzY1YWNiYzAyNDIuYmluZFBvcHVwKHBvcHVwX2UxOTc0MDI4OTIwYTQ4Mzg5NzFmYjZkOTU2Njg0YTVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyYzA2NTk5MDkxMTQ2YTdiNThiMmZhYzIwOTI2YjM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MzUyNSw4LjQ4NzU0NTk5MjI3NzMwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDY3Njc3MDBkNmU0MWVhYmIxYjUxYmUyZDI1NjMzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MjQwNDNiMjZmZjU0MjFlOGUzN2Q1YjBmYzAzYjUyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzI0MDQzYjI2ZmY1NDIxZThlMzdkNWIwZmMwM2I1MjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhlbm5lcmhvZmZtYW5uQHppcm1lLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTQ2NzY3NzAwZDZlNDFlYWJiMWI1MWJlMmQyNTYzM2Muc2V0Q29udGVudChodG1sXzcyNDA0M2IyNmZmNTQyMWU4ZTM3ZDViMGZjMDNiNTIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyYzA2NTk5MDkxMTQ2YTdiNThiMmZhYzIwOTI2YjM0LmJpbmRQb3B1cChwb3B1cF85NDY3Njc3MDBkNmU0MWVhYmIxYjUxYmUyZDI1NjMzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYWI2NjAyM2M4OWE0MTUwYTAwMjQ2ZTExNDQxYjI4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDM5MzY5OTk5OTk5NSw4LjQ5MDAxOTc3NjIyODQxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNjUzODhkMzE2ZTg0OTM0OWU1MjQyMzNiOTM5Y2FlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOTM1MWM1ODhiNDQ0MmVjOTgxM2YxZWIyNzA1MDcxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDkzNTFjNTg4YjQ0NDJlYzk4MTNmMWViMjcwNTA3MTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndydXBwZXJ0QGd1ZGUuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2NTM4OGQzMTZlODQ5MzQ5ZTUyNDIzM2I5MzljYWUyLnNldENvbnRlbnQoaHRtbF8wOTM1MWM1ODhiNDQ0MmVjOTgxM2YxZWIyNzA1MDcxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYWI2NjAyM2M4OWE0MTUwYTAwMjQ2ZTExNDQxYjI4My5iaW5kUG9wdXAocG9wdXBfYjY1Mzg4ZDMxNmU4NDkzNDllNTI0MjMzYjkzOWNhZTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2M5ZTRjM2I5Y2E5NGM3N2IxOTU5ZWQ5MDg2NmY2OTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk5Nzg2NSw4LjQ4MTMxMzUxODA1MzAyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMmIwYmU4OGFkNjk0YmUxODg4ZjFkOWFkOTQxNTIxYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYTNmNDQxYjYwMGM0OWY4OGQ1MDM1MTc0YTJmYTI4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2EzZjQ0MWI2MDBjNDlmODhkNTAzNTE3NGEyZmEyODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJyaWdpdHRlbWFyZ3JhZkBtYXJncmFmLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDJiMGJlODhhZDY5NGJlMTg4OGYxZDlhZDk0MTUyMWEuc2V0Q29udGVudChodG1sXzNhM2Y0NDFiNjAwYzQ5Zjg4ZDUwMzUxNzRhMmZhMjg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjOWU0YzNiOWNhOTRjNzdiMTk1OWVkOTA4NjZmNjkwLmJpbmRQb3B1cChwb3B1cF9kMmIwYmU4OGFkNjk0YmUxODg4ZjFkOWFkOTQxNTIxYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MDEzMDU1OGEzZDU0OGQ1OGQ4NjNhMzVjMDEyZmExZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjYxMzE1LDguNTA0OTMxMjEwMTIxNDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxNDg0MTNhODdlMTQyMWU5NTFjMjdhZWNjYmU3OTI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlM2I4ZjIxODVmYTRiYmE4NTRjYWY5MDVjZDFiY2NjID0gJCgnPGRpdiBpZD0iaHRtbF9iZTNiOGYyMTg1ZmE0YmJhODU0Y2FmOTA1Y2QxYmNjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWxpY2U1OUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTQ4NDEzYTg3ZTE0MjFlOTUxYzI3YWVjY2JlNzkyNS5zZXRDb250ZW50KGh0bWxfYmUzYjhmMjE4NWZhNGJiYTg1NGNhZjkwNWNkMWJjY2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTAxMzA1NThhM2Q1NDhkNThkODYzYTM1YzAxMmZhMWQuYmluZFBvcHVwKHBvcHVwX2IxNDg0MTNhODdlMTQyMWU5NTFjMjdhZWNjYmU3OTI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0ZTkxMjljNGFmNzQ0OWRhOWMwMDY4YWU2Mzg5MTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwOTIxOCw4LjUwMTY3NDIwMDg3OTMwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OTA5OWQ3NThiMjM0NWE0YTIxOTk1MmRkMGVmMmU2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzdkMzY3NTEzMGM0YzliYmFkYjQ2ZjU0YmExMDVkOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzM3ZDM2NzUxMzBjNGM5YmJhZGI0NmY1NGJhMTA1ZDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmF1Z3VzdGFzdGFockBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzkwOTlkNzU4YjIzNDVhNGEyMTk5NTJkZDBlZjJlNmEuc2V0Q29udGVudChodG1sX2MzN2QzNjc1MTMwYzRjOWJiYWRiNDZmNTRiYTEwNWQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0ZTkxMjljNGFmNzQ0OWRhOWMwMDY4YWU2Mzg5MTE2LmJpbmRQb3B1cChwb3B1cF83OTA5OWQ3NThiMjM0NWE0YTIxOTk1MmRkMGVmMmU2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MjAxMjQ3YTcwNDM0NWMwYjUxZTMxNDM3ODhiZTgyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmMThmZjgwYTZmNDQwOGI5YmUwZmM1MmU1NGFlZjA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5Zjg0OWI5MzExMTRlMDI5MjM3MDczOTE5MjE5MmYxID0gJCgnPGRpdiBpZD0iaHRtbF83OWY4NDliOTMxMTE0ZTAyOTIzNzA3MzkxOTIxOTJmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZGl0c2NobGVyaW5tZWhkaUBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmYxOGZmODBhNmY0NDA4YjliZTBmYzUyZTU0YWVmMDUuc2V0Q29udGVudChodG1sXzc5Zjg0OWI5MzExMTRlMDI5MjM3MDczOTE5MjE5MmYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyMDEyNDdhNzA0MzQ1YzBiNTFlMzE0Mzc4OGJlODIyLmJpbmRQb3B1cChwb3B1cF8yZjE4ZmY4MGE2ZjQ0MDhiOWJlMGZjNTJlNTRhZWYwNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMzllMTRiYWEyNzg0MDNiYmRiMGY0MjQ2MDRjYzlmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDE2OTIsOC40OTQyNzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4YWZkOGI3MzMyNDRiZGZiYjVmYzNmYTExNWQ3YWQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5YjY1MjI2MjkwZDQ5OTU4MjBiMTE2YTBhM2RmYTljID0gJCgnPGRpdiBpZD0iaHRtbF83OWI2NTIyNjI5MGQ0OTk1ODIwYjExNmEwYTNkZmE5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cXJpZWhsQHNlaWRlbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4YWZkOGI3MzMyNDRiZGZiYjVmYzNmYTExNWQ3YWQ5LnNldENvbnRlbnQoaHRtbF83OWI2NTIyNjI5MGQ0OTk1ODIwYjExNmEwYTNkZmE5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMzllMTRiYWEyNzg0MDNiYmRiMGY0MjQ2MDRjYzlmYS5iaW5kUG9wdXAocG9wdXBfYThhZmQ4YjczMzI0NGJkZmJiNWZjM2ZhMTE1ZDdhZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTNhNTZlNDMwNTczNGY0YmJmZjFiYWQ1OWRjNDc0ZjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTgyNDQzLDguNTA4MjQ2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDkwZGEwYmQyNGI0YWU4OWExY2MwNzI2YjYzZWMyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNzA0Y2I0OTliMjY0ODM4ODhiMTVmMWNlMWM3MmE4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTcwNGNiNDk5YjI2NDgzODg4YjE1ZjFjZTFjNzJhOGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJhcnRoa2xhdWRpYUB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0OTBkYTBiZDI0YjRhZTg5YTFjYzA3MjZiNjNlYzJjLnNldENvbnRlbnQoaHRtbF8xNzA0Y2I0OTliMjY0ODM4ODhiMTVmMWNlMWM3MmE4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85M2E1NmU0MzA1NzM0ZjRiYmZmMWJhZDU5ZGM0NzRmNC5iaW5kUG9wdXAocG9wdXBfNjQ5MGRhMGJkMjRiNGFlODlhMWNjMDcyNmI2M2VjMmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmY1NDRjNzgxMDJjNDIwNWJkOWFjNTUzOGZhMzk0YTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDA4NDM3NSw4LjQ5OTMyMDgzOTI5NDQwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOTMxYjY5NDA0MDM0YmNkOTQ4ZTQ4YTJlZDNlNjdhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjQ1MzlmM2JiNjI0NTQwYTY0ZDI0ZTQzZDVkYTQzMyA9ICQoJzxkaXYgaWQ9Imh0bWxfOGY0NTM5ZjNiYjYyNDU0MGE2NGQyNGU0M2Q1ZGE0MzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtyZWluYmVydGFAcGFlcnR6ZWx0Lm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTkzMWI2OTQwNDAzNGJjZDk0OGU0OGEyZWQzZTY3YTguc2V0Q29udGVudChodG1sXzhmNDUzOWYzYmI2MjQ1NDBhNjRkMjRlNDNkNWRhNDMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmNTQ0Yzc4MTAyYzQyMDViZDlhYzU1MzhmYTM5NGE5LmJpbmRQb3B1cChwb3B1cF9lOTMxYjY5NDA0MDM0YmNkOTQ4ZTQ4YTJlZDNlNjdhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82N2MwYzFkNTlmMmI0NmI3ODZiMTU0ZTVmMWI5MGJmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjQ2NjU1LDguNTEwMzg4Nzk1NjM3OTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyNjkzNzEzZTMyZTRjZWNhMTkzMDIzOGE2MDYxYzEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0ZDI4ZjcxNTgyOTRiOTliZDBiYjY5YjlkOWMxZTY0ID0gJCgnPGRpdiBpZD0iaHRtbF9lNGQyOGY3MTU4Mjk0Yjk5YmQwYmI2OWI5ZDljMWU2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bmljb2xlYmFydGhAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyNjkzNzEzZTMyZTRjZWNhMTkzMDIzOGE2MDYxYzEzLnNldENvbnRlbnQoaHRtbF9lNGQyOGY3MTU4Mjk0Yjk5YmQwYmI2OWI5ZDljMWU2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82N2MwYzFkNTlmMmI0NmI3ODZiMTU0ZTVmMWI5MGJmNi5iaW5kUG9wdXAocG9wdXBfODI2OTM3MTNlMzJlNGNlY2ExOTMwMjM4YTYwNjFjMTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODcxNmQwODAwMGMyNDJjMzkwMDRiYTgxOTVhYmU1NGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg1ODMyMDAwMDAwMDQsOC41MDQxMjk4MDMwMzAxOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzBiMjFhYjQzYWVmNDg2OTg3NDNmNTA3ZTE2YmFkNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWIyZGVjOTI5Yzk3NGZkYWFlOTAxMWFmMTljMjliN2UgPSAkKCc8ZGl2IGlkPSJodG1sXzliMmRlYzkyOWM5NzRmZGFhZTkwMTFhZjE5YzI5YjdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ua2FsbGVydEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzBiMjFhYjQzYWVmNDg2OTg3NDNmNTA3ZTE2YmFkNDguc2V0Q29udGVudChodG1sXzliMmRlYzkyOWM5NzRmZGFhZTkwMTFhZjE5YzI5YjdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3MTZkMDgwMDBjMjQyYzM5MDA0YmE4MTk1YWJlNTRlLmJpbmRQb3B1cChwb3B1cF83MGIyMWFiNDNhZWY0ODY5ODc0M2Y1MDdlMTZiYWQ0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjFkZTZjYjA3ZDk0YWZhYWZiZDMxMzhmNjhiNzUxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDA3NDg1LDguNTA0NTg5OTA4ODM2NzM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxMGFhNzVhOGFlMDQ0NzY4NWUwMTRiNzMyZmM3MTNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5NDA2MzJjNDI3ODRkZjI5NTlmNzM3YmE3ZTEyNDZiID0gJCgnPGRpdiBpZD0iaHRtbF9hOTQwNjMyYzQyNzg0ZGYyOTU5ZjczN2JhN2UxMjQ2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YmlyZ2l0dDUxQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxMGFhNzVhOGFlMDQ0NzY4NWUwMTRiNzMyZmM3MTNmLnNldENvbnRlbnQoaHRtbF9hOTQwNjMyYzQyNzg0ZGYyOTU5ZjczN2JhN2UxMjQ2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjFkZTZjYjA3ZDk0YWZhYWZiZDMxMzhmNjhiNzUxMS5iaW5kUG9wdXAocG9wdXBfNjEwYWE3NWE4YWUwNDQ3Njg1ZTAxNGI3MzJmYzcxM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGM1MWI4ZmUxNmZkNDMzYWE2NmE3NGIyMGE4MTRkMzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY1NDU4LDguNTA2NjY4NDA5MDc2NjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2MWM0ZWZhMmQzMTRhZjc5YjllYzc2MTA0ZDZkNmQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QyNWRjMWMwMzk2ZDRhNWM5MzQ1MDQyZDM0ODIwYjM1ID0gJCgnPGRpdiBpZD0iaHRtbF9kMjVkYzFjMDM5NmQ0YTVjOTM0NTA0MmQzNDgyMGIzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cGhvbHRAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2MWM0ZWZhMmQzMTRhZjc5YjllYzc2MTA0ZDZkNmQ5LnNldENvbnRlbnQoaHRtbF9kMjVkYzFjMDM5NmQ0YTVjOTM0NTA0MmQzNDgyMGIzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYzUxYjhmZTE2ZmQ0MzNhYTY2YTc0YjIwYTgxNGQzNS5iaW5kUG9wdXAocG9wdXBfMTYxYzRlZmEyZDMxNGFmNzliOWVjNzYxMDRkNmQ2ZDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWEyY2Q4YmNjZjM3NDUyODg2ZjVhNjg1Nzg2NjA5MzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTQ4MDM2NDk5OTk5OTYsOC40ODAwMzI2MTgwMDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwNDJjYjU2N2JkZTQ3ODk5YzBkZTgxYTRmMTkwYTBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkYWJlYzVjNTI5NTRjZTQ5Y2RmZmFmYWM3ZTYxZTc1ID0gJCgnPGRpdiBpZD0iaHRtbF8yZGFiZWM1YzUyOTU0Y2U0OWNkZmZhZmFjN2U2MWU3NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGF1c3Rlcm11ZWhsZUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwNDJjYjU2N2JkZTQ3ODk5YzBkZTgxYTRmMTkwYTBmLnNldENvbnRlbnQoaHRtbF8yZGFiZWM1YzUyOTU0Y2U0OWNkZmZhZmFjN2U2MWU3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTJjZDhiY2NmMzc0NTI4ODZmNWE2ODU3ODY2MDkzNi5iaW5kUG9wdXAocG9wdXBfODA0MmNiNTY3YmRlNDc4OTljMGRlODFhNGYxOTBhMGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDI2NDA2OGJmYzhjNDdlZGI0MTRhNjg0ZDVjZmM5YzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTI5NzI4LDguNDgxMjU4MzY1MDUxNDU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0ODdhZGFhOWNlMDRiODc5MDYyZTVhMjhmN2ViZWNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3NDc0N2EyNjRhNjRiZDliNzA5NWYwNzViOWM2Y2ZhID0gJCgnPGRpdiBpZD0iaHRtbF8zNzQ3NDdhMjY0YTY0YmQ5YjcwOTVmMDc1YjljNmNmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bW9uamExNUBzY2hhZWZlci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQ4N2FkYWE5Y2UwNGI4NzkwNjJlNWEyOGY3ZWJlY2Quc2V0Q29udGVudChodG1sXzM3NDc0N2EyNjRhNjRiZDliNzA5NWYwNzViOWM2Y2ZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyNjQwNjhiZmM4YzQ3ZWRiNDE0YTY4NGQ1Y2ZjOWM0LmJpbmRQb3B1cChwb3B1cF9lNDg3YWRhYTljZTA0Yjg3OTA2MmU1YTI4ZjdlYmVjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNTRjYjcxZmQyZTI0YjcwOGY5ZTIzYjZlMzIwNWIwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NTkwNDgsOC41MTQzNzI0OTQwNTI4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWFlZDIyM2U0Mjk0OWMzYjk3NzNkN2U5NzRjNDhkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYjhiNjAyYmU5MDI0OWE0ODY1MzFlNWYyMjVjNDUwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfM2I4YjYwMmJlOTAyNDlhNDg2NTMxZTVmMjI1YzQ1MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0ZWluYmVyZ2plbm5pZmVyQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTVhZWQyMjNlNDI5NDljM2I5NzczZDdlOTc0YzQ4ZGUuc2V0Q29udGVudChodG1sXzNiOGI2MDJiZTkwMjQ5YTQ4NjUzMWU1ZjIyNWM0NTAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NGNiNzFmZDJlMjRiNzA4ZjllMjNiNmUzMjA1YjA3LmJpbmRQb3B1cChwb3B1cF85NWFlZDIyM2U0Mjk0OWMzYjk3NzNkN2U5NzRjNDhkZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNmE2MTk3YzYyMzg0NjM2YTA5ZmQzNmNkMTA0YjkyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzA0MTA1MDAwMDAwNCw4LjQ4MzM3OTY0OTk4OTI2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWU5NDI3MDNjYjU0ZjAzYTNhYjNjZTM3NDdjNDc5OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzUwODYyZjJhZTU0NzJjOTRiODkyZmU1NThkMDVlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDM1MDg2MmYyYWU1NDcyYzk0Yjg5MmZlNTU4ZDA1ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1laWtiZWllckB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDVlOTQyNzAzY2I1NGYwM2EzYWIzY2UzNzQ3YzQ3OTkuc2V0Q29udGVudChodG1sXzAzNTA4NjJmMmFlNTQ3MmM5NGI4OTJmZTU1OGQwNWU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2YTYxOTdjNjIzODQ2MzZhMDlmZDM2Y2QxMDRiOTI4LmJpbmRQb3B1cChwb3B1cF8wNWU5NDI3MDNjYjU0ZjAzYTNhYjNjZTM3NDdjNDc5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ODNmYjg5YTE1ZTk0YTM4ODYyZWQzODk2ZTU0MjhiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjc3Njc1MDAwMDAwNiw4LjQ5NDE1ODA0MjEyMjgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWRhYmYyMDBkMzM0ZmY2YTYzODgzMzAyM2RmOWM0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzk5NzNiZTg4YjI0YTFkYjI2ODE3ZmMxZGUwYjg0NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWM5OTczYmU4OGIyNGExZGIyNjgxN2ZjMWRlMGI4NDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFzY2hvZW5sYW5kQG11ZWhsZS5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGVkYWJmMjAwZDMzNGZmNmE2Mzg4MzMwMjNkZjljNDEuc2V0Q29udGVudChodG1sX2FjOTk3M2JlODhiMjRhMWRiMjY4MTdmYzFkZTBiODQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4M2ZiODlhMTVlOTRhMzg4NjJlZDM4OTZlNTQyOGI1LmJpbmRQb3B1cChwb3B1cF9kZWRhYmYyMDBkMzM0ZmY2YTYzODgzMzAyM2RmOWM0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNTc1YzQ0YzU5ODQ0MGEwOWI5ZGI4NWMyZDE3NzI4ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjkxMzQ1LDguNTExODIxMDMzOTg3NDM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzZWE2MzkyZDg5MjRlY2Y5MDI2YmMyN2U1NGY4OTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlMGUzODhmNzE0MDQxNmVhMDJmODU0ZDhmZTk4OTMzID0gJCgnPGRpdiBpZD0iaHRtbF9mZTBlMzg4ZjcxNDA0MTZlYTAyZjg1NGQ4ZmU5ODkzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aHVlYmVsZ2Vvcmdpb3NAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iM2VhNjM5MmQ4OTI0ZWNmOTAyNmJjMjdlNTRmODkzNy5zZXRDb250ZW50KGh0bWxfZmUwZTM4OGY3MTQwNDE2ZWEwMmY4NTRkOGZlOTg5MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzU3NWM0NGM1OTg0NDBhMDliOWRiODVjMmQxNzcyOGQuYmluZFBvcHVwKHBvcHVwX2IzZWE2MzkyZDg5MjRlY2Y5MDI2YmMyN2U1NGY4OTM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1ZmJjYmU5ZjM3MjQ2YzNiZjc5NDZlYzg1MzRjMmMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MDYyMDUsOC41MDE0ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzYjVmNDM1ZTcwMTQ3YzM5ODkwZDNjYmE2NTM4ODNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlZmFhNGU2NmU3NTRjNmQ4NjA4OGYyN2YwY2NkYmFhID0gJCgnPGRpdiBpZD0iaHRtbF9jZWZhYTRlNjZlNzU0YzZkODYwODhmMjdmMGNjZGJhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a2FldGhpc3RvbGxAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xM2I1ZjQzNWU3MDE0N2MzOTg5MGQzY2JhNjUzODgzYS5zZXRDb250ZW50KGh0bWxfY2VmYWE0ZTY2ZTc1NGM2ZDg2MDg4ZjI3ZjBjY2RiYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjVmYmNiZTlmMzcyNDZjM2JmNzk0NmVjODUzNGMyYzMuYmluZFBvcHVwKHBvcHVwXzEzYjVmNDM1ZTcwMTQ3YzM5ODkwZDNjYmE2NTM4ODNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhNjA1NDg1ZmUwZTQ1MDU5NTVlMTBlZWJmMjM0YTVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5NjA5LDguNTA4MDE1NjYzMTMzOTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmZTAxZmU5YjM4MzQ3N2M5MTlmZjk4MDcyNDM4ZDhmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiMzMyYjc1MDJjZDRlNGJiN2FhZWE0MzdmMTZhZDEyID0gJCgnPGRpdiBpZD0iaHRtbF84YjMzMmI3NTAyY2Q0ZTRiYjdhYWVhNDM3ZjE2YWQxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+anNjaHVjaGhhcmR0QHdpZWxvY2guZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmZTAxZmU5YjM4MzQ3N2M5MTlmZjk4MDcyNDM4ZDhmLnNldENvbnRlbnQoaHRtbF84YjMzMmI3NTAyY2Q0ZTRiYjdhYWVhNDM3ZjE2YWQxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYTYwNTQ4NWZlMGU0NTA1OTU1ZTEwZWViZjIzNGE1ZS5iaW5kUG9wdXAocG9wdXBfN2ZlMDFmZTliMzgzNDc3YzkxOWZmOTgwNzI0MzhkOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDY5NzRjY2Q2NjdjNDZmMmJlNTVmMmY2OWU2ODc3NjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTE1OTIyOTk5OTk5OTUsOC40ODU1Nzg3MjY0Mzc2NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzk0NGRkMGUzMDRhNGJlZGJmOTQ2MjNjNjEzMjAzNzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTliYTRjZGE5NzhhNGYyZDlmYTJjNGE5YzA1YWExMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzU5YmE0Y2RhOTc4YTRmMmQ5ZmEyYzRhOWMwNWFhMTAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sZW9uNzBAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5NDRkZDBlMzA0YTRiZWRiZjk0NjIzYzYxMzIwMzczLnNldENvbnRlbnQoaHRtbF81OWJhNGNkYTk3OGE0ZjJkOWZhMmM0YTljMDVhYTEwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNjk3NGNjZDY2N2M0NmYyYmU1NWYyZjY5ZTY4Nzc2My5iaW5kUG9wdXAocG9wdXBfYzk0NGRkMGUzMDRhNGJlZGJmOTQ2MjNjNjEzMjAzNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQzMmM0ODE5ZGU0NDU2MWI2ZmJjODZkMjE4NzljM2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTE1OTIyOTk5OTk5OTUsOC40ODU1Nzg3MjY0Mzc2NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQwMDQ0MDFhMGQ0NGU4NmI2ZDY5MjRlMGNjZWFmNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzgyMGEyNzZlMDk3NDBkYmFjOWEyODZlZDMwNjBmZWYgPSAkKCc8ZGl2IGlkPSJodG1sX2M4MjBhMjc2ZTA5NzQwZGJhYzlhMjg2ZWQzMDYwZmVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5nb3R0aGFyZDY0QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDQwMDQ0MDFhMGQ0NGU4NmI2ZDY5MjRlMGNjZWFmNGEuc2V0Q29udGVudChodG1sX2M4MjBhMjc2ZTA5NzQwZGJhYzlhMjg2ZWQzMDYwZmVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FkMzJjNDgxOWRlNDQ1NjFiNmZiYzg2ZDIxODc5YzNhLmJpbmRQb3B1cChwb3B1cF8wNDAwNDQwMWEwZDQ0ZTg2YjZkNjkyNGUwY2NlYWY0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZGI4ZDU4MmM5YTc0ZTRlOTRmZGI3NzMwZjFlNzMyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTM5OTQ1LDguNTAwMzE2NzIzNDE3OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTBjZWM4NDY4NmVjNGNkZjgyNzY1NzAyMzU0YTU2MjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjYxMGRmYTcxNThhNGFlNGI1NGE2MmVkNGRlMDAyZTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2MTBkZmE3MTU4YTRhZTRiNTRhNjJlZDRkZTAwMmU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij52emlybWVAdGx1c3Rlay5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTBjZWM4NDY4NmVjNGNkZjgyNzY1NzAyMzU0YTU2MjMuc2V0Q29udGVudChodG1sX2Y2MTBkZmE3MTU4YTRhZTRiNTRhNjJlZDRkZTAwMmU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkYjhkNTgyYzlhNzRlNGU5NGZkYjc3MzBmMWU3MzI0LmJpbmRQb3B1cChwb3B1cF85MGNlYzg0Njg2ZWM0Y2RmODI3NjU3MDIzNTRhNTYyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Y2M1NzUzMDg4Y2I0YmJkYmNjMTkwNzE4MWUwN2VlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTQ5NTgsOC40ODQ1NjgyNDYzMTMwNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTEyMDk5NDRjYmI0NDIxZGI1N2M5ZTVjYjgyYzRmNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDI0ZDA3MzhhOWYxNGQ5M2IyZDUxYzQwZDRlNWY0NjYgPSAkKCc8ZGl2IGlkPSJodG1sX2QyNGQwNzM4YTlmMTRkOTNiMmQ1MWM0MGQ0ZTVmNDY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56a3VobEBtaWVzLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTEyMDk5NDRjYmI0NDIxZGI1N2M5ZTVjYjgyYzRmNzYuc2V0Q29udGVudChodG1sX2QyNGQwNzM4YTlmMTRkOTNiMmQ1MWM0MGQ0ZTVmNDY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhjYzU3NTMwODhjYjRiYmRiY2MxOTA3MTgxZTA3ZWUyLmJpbmRQb3B1cChwb3B1cF85MTIwOTk0NGNiYjQ0MjFkYjU3YzllNWNiODJjNGY3Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOWYzYjQ0MDI2MjQ0OWI1ODg0ZmI1NjAwZjI2MGFhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTM2OTI1LDguNTA4Nzg3MjcyMTAwMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTY0OWRlNDgzNTQyNDUxNzk3ZTFhYjIwMzI1ZjJlY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2RkYTViYmZiZWMwNDE3ZmE1YWZhNzU4NDM5YzRhOTQgPSAkKCc8ZGl2IGlkPSJodG1sXzdkZGE1YmJmYmVjMDQxN2ZhNWFmYTc1ODQzOWM0YTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oZXlkcmljaGFudG9uQGVobGVydC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTY0OWRlNDgzNTQyNDUxNzk3ZTFhYjIwMzI1ZjJlY2Muc2V0Q29udGVudChodG1sXzdkZGE1YmJmYmVjMDQxN2ZhNWFmYTc1ODQzOWM0YTk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y5ZjNiNDQwMjYyNDQ5YjU4ODRmYjU2MDBmMjYwYWFlLmJpbmRQb3B1cChwb3B1cF9hNjQ5ZGU0ODM1NDI0NTE3OTdlMWFiMjAzMjVmMmVjYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMzU4M2MwNjcyN2I0ZDFkYTU3MGFlN2JiNTQyYTFiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTUyMTEsOC40OTkwNjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0NmYxZDA5ZmNiNjQ0ZGU4ZGU5M2RlYTM1NGFjNDAzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwZDUwZDg2YTVlMjRlNmY5ZTZiNzZhYjYxZGU4MjZkID0gJCgnPGRpdiBpZD0iaHRtbF9hMGQ1MGQ4NmE1ZTI0ZTZmOWU2Yjc2YWI2MWRlODI2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZHJ1YmlubWFyY2VsbGFAcnVwcGVydC5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0NmYxZDA5ZmNiNjQ0ZGU4ZGU5M2RlYTM1NGFjNDAzLnNldENvbnRlbnQoaHRtbF9hMGQ1MGQ4NmE1ZTI0ZTZmOWU2Yjc2YWI2MWRlODI2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzU4M2MwNjcyN2I0ZDFkYTU3MGFlN2JiNTQyYTFiMC5iaW5kUG9wdXAocG9wdXBfZjQ2ZjFkMDlmY2I2NDRkZThkZTkzZGVhMzU0YWM0MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmE3ZjUxZDhhNTQzNGU3ZDg3OGVjNDAzNTlkZmNkYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTc2OTczMDAwMDAwMDQsOC41MDcxNDk3MDAwMDAwMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzhmMGM5ZDZkZjY1NDRkNmFiMGYyZDc0YjJlNDcwNzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODUyMTIxMGEwNjA1NDA4NmFlYTY3NTJjNWU3YmMyODEgPSAkKCc8ZGl2IGlkPSJodG1sXzg1MjEyMTBhMDYwNTQwODZhZWE2NzUyYzVlN2JjMjgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij55ZXR6b2xkQGhpbGxlci5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4ZjBjOWQ2ZGY2NTQ0ZDZhYjBmMmQ3NGIyZTQ3MDc2LnNldENvbnRlbnQoaHRtbF84NTIxMjEwYTA2MDU0MDg2YWVhNjc1MmM1ZTdiYzI4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYTdmNTFkOGE1NDM0ZTdkODc4ZWM0MDM1OWRmY2RjNi5iaW5kUG9wdXAocG9wdXBfMzhmMGM5ZDZkZjY1NDRkNmFiMGYyZDc0YjJlNDcwNzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDNiMDExYzQwZGY3NGNjMDkwM2Y0ZDJlM2YyZTc3OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY1NDU4LDguNTA2NjY4NDA5MDc2NjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNDI5ODE2MDE2YzRmMjZhMDYwM2FjOGY3MGQ1YTIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1YjZhNWRkNDc0MDQ4NjliYjcyM2E1YjE0NTEyZGZmID0gJCgnPGRpdiBpZD0iaHRtbF9hNWI2YTVkZDQ3NDA0ODY5YmI3MjNhNWIxNDUxMmRmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z29yYW41N0BnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkNDI5ODE2MDE2YzRmMjZhMDYwM2FjOGY3MGQ1YTIwLnNldENvbnRlbnQoaHRtbF9hNWI2YTVkZDQ3NDA0ODY5YmI3MjNhNWIxNDUxMmRmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kM2IwMTFjNDBkZjc0Y2MwOTAzZjRkMmUzZjJlNzc4ZS5iaW5kUG9wdXAocG9wdXBfY2Q0Mjk4MTYwMTZjNGYyNmEwNjAzYWM4ZjcwZDVhMjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2Q1NmUxN2I2ZWYxNDljZDhjZDlmZjI4YjczZGRiODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY1OTAyNSw4LjQ5MjQ2MzU0NjMyOTI4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjZiZWI2NTAwZWI0MmVjOGIxZTUyMWMxY2QxZWE3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZGYwYjU4NGFkMjc0ZmY4OWRiNmY0ZTJhMmYzZGQ5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGRmMGI1ODRhZDI3NGZmODlkYjZmNGUyYTJmM2RkOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtsYXVkaWFoYXJ0bWFubkBndXRrbmVjaHQuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZjZiZWI2NTAwZWI0MmVjOGIxZTUyMWMxY2QxZWE3OS5zZXRDb250ZW50KGh0bWxfNGRmMGI1ODRhZDI3NGZmODlkYjZmNGUyYTJmM2RkOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q1NmUxN2I2ZWYxNDljZDhjZDlmZjI4YjczZGRiODYuYmluZFBvcHVwKHBvcHVwX2FmNmJlYjY1MDBlYjQyZWM4YjFlNTIxYzFjZDFlYTc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4MWUzNzQ0ZWU2OTRhODY4OWE3ZTk3ZjM5NjQ0NDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NTE1NzUsOC41MDgzNjI5NzA5NTc3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjg5NDY2YzY5NGM0OWM0YTVkZDdhOGRmYTJmNjA4NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOWNhZWVjNjBlMTI0ZjhjYTM1ZjM5ZTk0YjNiNjE4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzljYWVlYzYwZTEyNGY4Y2EzNWYzOWU5NGIzYjYxOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmthZXN0ZXJoZWxnYUB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTI4OTQ2NmM2OTRjNDljNGE1ZGQ3YThkZmEyZjYwODQuc2V0Q29udGVudChodG1sXzM5Y2FlZWM2MGUxMjRmOGNhMzVmMzllOTRiM2I2MThhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA4MWUzNzQ0ZWU2OTRhODY4OWE3ZTk3ZjM5NjQ0NDViLmJpbmRQb3B1cChwb3B1cF9lMjg5NDY2YzY5NGM0OWM0YTVkZDdhOGRmYTJmNjA4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYWY3ODM1YmRhMzY0ZjY0OTFlOTUyNWRkYjIwNzg5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjhmNWYyNTNjODA3NDI5ZDk4Y2ZmNDJmZWUyYTIwZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGE0YmQ3ZTNjZmQ5NGY0M2JiYjhhMDk0MjIxNDE4ZmMgPSAkKCc8ZGl2IGlkPSJodG1sXzhhNGJkN2UzY2ZkOTRmNDNiYmI4YTA5NDIyMTQxOGZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdG9sbHN0amVwYW5AdWxscmljaC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjhmNWYyNTNjODA3NDI5ZDk4Y2ZmNDJmZWUyYTIwZjUuc2V0Q29udGVudChodG1sXzhhNGJkN2UzY2ZkOTRmNDNiYmI4YTA5NDIyMTQxOGZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhZjc4MzViZGEzNjRmNjQ5MWU5NTI1ZGRiMjA3ODlkLmJpbmRQb3B1cChwb3B1cF9mOGY1ZjI1M2M4MDc0MjlkOThjZmY0MmZlZTJhMjBmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMzNmOWUxNDk1MDk0OGY4YWM1OTdhNjBjMTc4NzcxMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjQxMTMsOC40OTc2Mjg1MDk5NzgxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWM1MzJjMzRkYzU1NDc4N2JhODJiNzg1ZmMyNDU5ZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmJjZWU3NzZiZTc1NGUyNThhODM0Mjk3MzI5ZmJlZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzZiY2VlNzc2YmU3NTRlMjU4YTgzNDI5NzMyOWZiZWU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hbGV4ZWlob2xzdGVuQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWM1MzJjMzRkYzU1NDc4N2JhODJiNzg1ZmMyNDU5Zjguc2V0Q29udGVudChodG1sXzZiY2VlNzc2YmU3NTRlMjU4YTgzNDI5NzMyOWZiZWU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzM2Y5ZTE0OTUwOTQ4ZjhhYzU5N2E2MGMxNzg3NzEyLmJpbmRQb3B1cChwb3B1cF8xYzUzMmMzNGRjNTU0Nzg3YmE4MmI3ODVmYzI0NTlmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZWI2YzFlNTBhNDQ0ZGQ0OGJkN2E5M2Y0MmZjYTExZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNDQ3NjI1LDguNDc5NTQ2MTMwMTY5Njg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxYzkzZGRhNzgwMzRhZTc5NDZiNWIzNmFiODcxZGFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzYjk1ZjhiMDExMDRiY2ZhYTc2M2FhNDQ2NWM5ZTRmID0gJCgnPGRpdiBpZD0iaHRtbF8wM2I5NWY4YjAxMTA0YmNmYWE3NjNhYTQ0NjVjOWU0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3BldWtlcnRAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MWM5M2RkYTc4MDM0YWU3OTQ2YjViMzZhYjg3MWRhYi5zZXRDb250ZW50KGh0bWxfMDNiOTVmOGIwMTEwNGJjZmFhNzYzYWE0NDY1YzllNGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWViNmMxZTUwYTQ0NGRkNDhiZDdhOTNmNDJmY2ExMWYuYmluZFBvcHVwKHBvcHVwXzgxYzkzZGRhNzgwMzRhZTc5NDZiNWIzNmFiODcxZGFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmNDBkZDdiYmU3MDQ1YzdhZmMyNzY5YWRiODkwODUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2ODQ0MDUwMDAwMDA0LDguNDc4ODEyOTExNDU1OTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y5ZDA2MzYwMDQzZTRlYzViYzRmMTE4NzdjNGFlODZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2ZTVjNTg3ZWVlYzQ2MjJiYTgyMmEzM2E3ZjExNDEyID0gJCgnPGRpdiBpZD0iaHRtbF85NmU1YzU4N2VlZWM0NjIyYmE4MjJhMzNhN2YxMTQxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2Vvcmdpb3NzY2hsZWljaEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y5ZDA2MzYwMDQzZTRlYzViYzRmMTE4NzdjNGFlODZkLnNldENvbnRlbnQoaHRtbF85NmU1YzU4N2VlZWM0NjIyYmE4MjJhMzNhN2YxMTQxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZjQwZGQ3YmJlNzA0NWM3YWZjMjc2OWFkYjg5MDg1Mi5iaW5kUG9wdXAocG9wdXBfZjlkMDYzNjAwNDNlNGVjNWJjNGYxMTg3N2M0YWU4NmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjk4YTRiZmU3N2I1NDc3MDhjNDgwYzVkMzQwZDdkYWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTU4Mjc5LDguNDgxMDQyOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYmYyYjg4ZTUwYzM0YmUzOTU1MTljMTM4OTYzYzEyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Y2E4MzYyZTAxNzY0Zjc2YTU1NjY4NWQ1NDgwMDEzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGNhODM2MmUwMTc2NGY3NmE1NTY2ODVkNTQ4MDAxMzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhhZXJpbmdhbGljZUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYmYyYjg4ZTUwYzM0YmUzOTU1MTljMTM4OTYzYzEyNi5zZXRDb250ZW50KGh0bWxfOGNhODM2MmUwMTc2NGY3NmE1NTY2ODVkNTQ4MDAxMzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjk4YTRiZmU3N2I1NDc3MDhjNDgwYzVkMzQwZDdkYWMuYmluZFBvcHVwKHBvcHVwX2ViZjJiODhlNTBjMzRiZTM5NTUxOWMxMzg5NjNjMTI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhM2UyZjQ5YmE2ZjRmYzI4NzE0ODZlZTdmMTRjMzE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMDY2MzUsOC40OTI5MzIyNTEwNTg2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODk5ODJlMDRkYjczNDg3ZTk0YTQ2MzE0ZjQ0YjRjNDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTgyZGZlZjJhMzdmNGYwYjliZWIzNzRmMTcwN2QwYzIgPSAkKCc8ZGl2IGlkPSJodG1sX2E4MmRmZWYyYTM3ZjRmMGI5YmViMzc0ZjE3MDdkMGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tYXJpdXN6NTZAa3JlaW4uY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OTk4MmUwNGRiNzM0ODdlOTRhNDYzMTRmNDRiNGM0Mi5zZXRDb250ZW50KGh0bWxfYTgyZGZlZjJhMzdmNGYwYjliZWIzNzRmMTcwN2QwYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWEzZTJmNDliYTZmNGZjMjg3MTQ4NmVlN2YxNGMzMTYuYmluZFBvcHVwKHBvcHVwXzg5OTgyZTA0ZGI3MzQ4N2U5NGE0NjMxNGY0NGI0YzQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkZTA3NTJiZjZmZTRhZThiM2FlMGVlNDFhNTkzYjVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5NjcwMiw4LjUwMjM0NzM0ODI5NjYxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jODhhZDlkMTVmZDk0ZDYyODc3YjgzZDQ1ZDU4ZDY2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjI2MDQyYWUzOWY0ZWY0YWE1ZTY2YzMxZDZmY2U0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTIyNjA0MmFlMzlmNGVmNGFhNWU2NmMzMWQ2ZmNlNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0ZXZlMzVAcGxhdGguY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODhhZDlkMTVmZDk0ZDYyODc3YjgzZDQ1ZDU4ZDY2NS5zZXRDb250ZW50KGh0bWxfOTIyNjA0MmFlMzlmNGVmNGFhNWU2NmMzMWQ2ZmNlNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmRlMDc1MmJmNmZlNGFlOGIzYWUwZWU0MWE1OTNiNWYuYmluZFBvcHVwKHBvcHVwX2M4OGFkOWQxNWZkOTRkNjI4NzdiODNkNDVkNThkNjY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxNzAxYjFjYWRhNjQyYmViZDczYzY4YmQ2OTJkZjFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMDI4NDUsOC41MDM5MzI3OTk2MjcxMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBlZmEzODljZGRhNDUxZmE1Nzg1N2VhODljYzRkMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDk4NTNlNDJiMWY3NDBhMGJmYjFmMzgyYWVmMWQzNzggPSAkKCc8ZGl2IGlkPSJodG1sXzQ5ODUzZTQyYjFmNzQwYTBiZmIxZjM4MmFlZjFkMzc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5xYmVuZGVyQHdlaXNzLm9yZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODBlZmEzODljZGRhNDUxZmE1Nzg1N2VhODljYzRkMGMuc2V0Q29udGVudChodG1sXzQ5ODUzZTQyYjFmNzQwYTBiZmIxZjM4MmFlZjFkMzc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxNzAxYjFjYWRhNjQyYmViZDczYzY4YmQ2OTJkZjFiLmJpbmRQb3B1cChwb3B1cF84MGVmYTM4OWNkZGE0NTFmYTU3ODU3ZWE4OWNjNGQwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xM2NkMWM0M2YxNGQ0NGJhYWJlZTAyYjQ1M2YyOWVmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTIyMjA1LDguNDg0ODA2NDU3NjQ1MTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2MzI5NmY0YWIxNjQ2NzI5ODMyZTM2ZTcxMWVkMjA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhNWU3MjdiZWJlZjQxNTA4MTAyNjYyMTg5NTA4ZjJkID0gJCgnPGRpdiBpZD0iaHRtbF85YTVlNzI3YmViZWY0MTUwODEwMjY2MjE4OTUwOGYyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZWhyZW5mcmllZDI4QGhvbHQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2MzI5NmY0YWIxNjQ2NzI5ODMyZTM2ZTcxMWVkMjA1LnNldENvbnRlbnQoaHRtbF85YTVlNzI3YmViZWY0MTUwODEwMjY2MjE4OTUwOGYyZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2NkMWM0M2YxNGQ0NGJhYWJlZTAyYjQ1M2YyOWVmYi5iaW5kUG9wdXAocG9wdXBfMTYzMjk2ZjRhYjE2NDY3Mjk4MzJlMzZlNzExZWQyMDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM1MzE1NTRiNDM5NDg2MWE2YjcwYjQxZGE4ODU0ZmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY4NDQwNTAwMDAwMDQsOC40Nzg4MTI5MTE0NTU5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVkNzdlNTA4OGUxNDZlNmFiMzhiMDM0MTJiOTk1MGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE4MTcxZjJkNjFkNGMyODhlZjM2NjU4MzlhNDFjYWUgPSAkKCc8ZGl2IGlkPSJodG1sX2ZhODE3MWYyZDYxZDRjMjg4ZWYzNjY1ODM5YTQxY2FlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5saWRpYTA4QGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmVkNzdlNTA4OGUxNDZlNmFiMzhiMDM0MTJiOTk1MGQuc2V0Q29udGVudChodG1sX2ZhODE3MWYyZDYxZDRjMjg4ZWYzNjY1ODM5YTQxY2FlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjNTMxNTU0YjQzOTQ4NjFhNmI3MGI0MWRhODg1NGZiLmJpbmRQb3B1cChwb3B1cF9iZWQ3N2U1MDg4ZTE0NmU2YWIzOGIwMzQxMmI5OTUwZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODA2ZjJmOTA3YWI0MjQ5ODZiODk0Mzc5ZjdmNWU3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY0MzliZDVkNzE3NDY3ZDhlYzE3ODdkNWFjM2E3MzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjBhOWVmN2FmNGRhNDQ1NmIyOTEyNjMzMTc5ZDI1OGMgPSAkKCc8ZGl2IGlkPSJodG1sX2IwYTllZjdhZjRkYTQ0NTZiMjkxMjYzMzE3OWQyNThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij50cmF1dGU0NUBoZXNzZS5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2NDM5YmQ1ZDcxNzQ2N2Q4ZWMxNzg3ZDVhYzNhNzMzLnNldENvbnRlbnQoaHRtbF9iMGE5ZWY3YWY0ZGE0NDU2YjI5MTI2MzMxNzlkMjU4Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ODA2ZjJmOTA3YWI0MjQ5ODZiODk0Mzc5ZjdmNWU3NS5iaW5kUG9wdXAocG9wdXBfODY0MzliZDVkNzE3NDY3ZDhlYzE3ODdkNWFjM2E3MzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjM3NmUxOGRhZDhhNDQyZTk0MDk5NmIyMDhlMmVhNGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTc1NTA5NDk5OTk5OTYsOC41MTI5NDA0ODU5NzQyMDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGM4YWQ1OTgzM2Q2NGFkNjg4OGE5YmU2NTEzNDU3ZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2EwZGIxNTUxYmY1NGFmOTg0MTU4ZmJlNmNiNjliZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzdhMGRiMTU1MWJmNTRhZjk4NDE1OGZiZTZjYjY5YmU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGFocmhpbGRlQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGM4YWQ1OTgzM2Q2NGFkNjg4OGE5YmU2NTEzNDU3ZDcuc2V0Q29udGVudChodG1sXzdhMGRiMTU1MWJmNTRhZjk4NDE1OGZiZTZjYjY5YmU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIzNzZlMThkYWQ4YTQ0MmU5NDA5OTZiMjA4ZTJlYTRkLmJpbmRQb3B1cChwb3B1cF9kYzhhZDU5ODMzZDY0YWQ2ODg4YTliZTY1MTM0NTdkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMDYyMTExNjFjNmM0YjU0YjJhMjUyY2FlMzZhMWU5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDA0OSw4LjUwMDc2MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWJiNTZhNTZiYjA0NGEwZTkwY2U4YTk0ZTk4N2QxZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTlhMDk1M2M1YTcxNDRhYzlhNTk1YTg5MDk1YTZmNDggPSAkKCc8ZGl2IGlkPSJodG1sXzE5YTA5NTNjNWE3MTQ0YWM5YTU5NWE4OTA5NWE2ZjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53YWxseTczQGhleWRyaWNoLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWJiNTZhNTZiYjA0NGEwZTkwY2U4YTk0ZTk4N2QxZGMuc2V0Q29udGVudChodG1sXzE5YTA5NTNjNWE3MTQ0YWM5YTU5NWE4OTA5NWE2ZjQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwNjIxMTE2MWM2YzRiNTRiMmEyNTJjYWUzNmExZTk4LmJpbmRQb3B1cChwb3B1cF9hYmI1NmE1NmJiMDQ0YTBlOTBjZThhOTRlOTg3ZDFkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMGI4MjkxM2ZmYWY0YTA0YjY4YjNhYTBlNWFmYTA4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzU3MjksOC40OTg2MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgzYjdkNjg1ZDJhMjRjZjliNTcxYTNjMzRiZWVlM2IyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkMzg2NjdjNGEzNjQ4MmRhMmMyMDIzZmZjNTI1NTJhID0gJCgnPGRpdiBpZD0iaHRtbF82ZDM4NjY3YzRhMzY0ODJkYTJjMjAyM2ZmYzUyNTUyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+enJvZ2dlQGthcnouY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2I3ZDY4NWQyYTI0Y2Y5YjU3MWEzYzM0YmVlZTNiMi5zZXRDb250ZW50KGh0bWxfNmQzODY2N2M0YTM2NDgyZGEyYzIwMjNmZmM1MjU1MmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzBiODI5MTNmZmFmNGEwNGI2OGIzYWEwZTVhZmEwODQuYmluZFBvcHVwKHBvcHVwXzgzYjdkNjg1ZDJhMjRjZjliNTcxYTNjMzRiZWVlM2IyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg0Y2U2NDRjOWE5OTRjNmNhNTY4YTk5MzU5NzkwNjc0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5OTI2OSw4LjQ4MjE1NjIwMTM2NjExM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTUxY2UzZTBkNjI0YjEzYTgyMTkwODMyNDQ0MTk3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYmJhZmY3NTI3YmQ0NDFlOGMzM2FjZTNjZjUxMTA4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGJiYWZmNzUyN2JkNDQxZThjMzNhY2UzY2Y1MTEwODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmlybWFzY2hlaWJlQHNjaHdpdGFsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmU1MWNlM2UwZDYyNGIxM2E4MjE5MDgzMjQ0NDE5N2Iuc2V0Q29udGVudChodG1sXzBiYmFmZjc1MjdiZDQ0MWU4YzMzYWNlM2NmNTExMDg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg0Y2U2NDRjOWE5OTRjNmNhNTY4YTk5MzU5NzkwNjc0LmJpbmRQb3B1cChwb3B1cF9iZTUxY2UzZTBkNjI0YjEzYTgyMTkwODMyNDQ0MTk3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTVlNDYzNGNjMDA0ZmZhODgwZDEzYzRiNjcxOWNjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWM1N2ExODM0ZjE1NGUxNTgxNDJhZGZhMGI4MjMwMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTAyMDcyMTAxNjJjNDYyOGIwNTJjODc2ZWQyNzE2NTcgPSAkKCc8ZGl2IGlkPSJodG1sXzUwMjA3MjEwMTYyYzQ2MjhiMDUyYzg3NmVkMjcxNjU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56b3JiYWNoa2FybC1mcmllZHJpY2hAdGx1c3Rlay5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWM1N2ExODM0ZjE1NGUxNTgxNDJhZGZhMGI4MjMwMTUuc2V0Q29udGVudChodG1sXzUwMjA3MjEwMTYyYzQ2MjhiMDUyYzg3NmVkMjcxNjU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhNWU0NjM0Y2MwMDRmZmE4ODBkMTNjNGI2NzE5Y2MxLmJpbmRQb3B1cChwb3B1cF81YzU3YTE4MzRmMTU0ZTE1ODE0MmFkZmEwYjgyMzAxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NjQ5ZjM2MmQ2MGE0NDk4Yjg5YjQ1ZjVjYWI4N2Q1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NTkxNTg1LDguNTAzODE0Nzk2Mjg1Nzk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwMTNiN2FlNmU2OTRiNjQ4MWI4MTc4ZTY2MWU4OTgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlYWJjMWQwMmIyNjRhNzdiMjYzYTJkZGMzNGI1ZmE3ID0gJCgnPGRpdiBpZD0iaHRtbF83ZWFiYzFkMDJiMjY0YTc3YjI2M2EyZGRjMzRiNWZhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGVpbnotZ2Vvcmdwb2VsaXR6QGZpZWJpZy5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwMTNiN2FlNmU2OTRiNjQ4MWI4MTc4ZTY2MWU4OTgxLnNldENvbnRlbnQoaHRtbF83ZWFiYzFkMDJiMjY0YTc3YjI2M2EyZGRjMzRiNWZhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NjQ5ZjM2MmQ2MGE0NDk4Yjg5YjQ1ZjVjYWI4N2Q1Ni5iaW5kUG9wdXAocG9wdXBfNDAxM2I3YWU2ZTY5NGI2NDgxYjgxNzhlNjYxZTg5ODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGIzOTYwYTgzZGNmNGJlNTlkM2I2YmYzMjdjZDNkYTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAxNjkyLDguNDk0MjcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDI5OGRlMjQxMzM0NTJkYTljN2IyNzNmNTcyNjkwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNmFjMGVmZGM3MTc0NDhjOGRiM2UyMDdmZTYwMzViNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDZhYzBlZmRjNzE3NDQ4YzhkYjNlMjA3ZmU2MDM1YjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdpZXNlbGExMUBqb2hhbm4uY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZDI5OGRlMjQxMzM0NTJkYTljN2IyNzNmNTcyNjkwMS5zZXRDb250ZW50KGh0bWxfZDZhYzBlZmRjNzE3NDQ4YzhkYjNlMjA3ZmU2MDM1YjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGIzOTYwYTgzZGNmNGJlNTlkM2I2YmYzMjdjZDNkYTEuYmluZFBvcHVwKHBvcHVwXzRkMjk4ZGUyNDEzMzQ1MmRhOWM3YjI3M2Y1NzI2OTAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxYzEzY2NmOTgyZDQyMTRiODczMGM5ODY3NjhlZjcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzOTM2Miw4LjQ3NzgyNDQyOTQ3NTQ2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjQ2M2I1ZGEzOGQ0ODllYmM0NzczYjg1M2M1OTNhZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTg0YTJiY2IyMTY0YTA2OGFmNjkwYzNmOWUxOTc2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDE4NGEyYmNiMjE2NGEwNjhhZjY5MGMzZjllMTk3NmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNhbWlsbGFydWRvbHBoQGplc3NlbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmNDYzYjVkYTM4ZDQ4OWViYzQ3NzNiODUzYzU5M2FlLnNldENvbnRlbnQoaHRtbF80MTg0YTJiY2IyMTY0YTA2OGFmNjkwYzNmOWUxOTc2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMWMxM2NjZjk4MmQ0MjE0Yjg3MzBjOTg2NzY4ZWY3Mi5iaW5kUG9wdXAocG9wdXBfM2Y0NjNiNWRhMzhkNDg5ZWJjNDc3M2I4NTNjNTkzYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGFhMWU5YmNjZjdlNGQxYmI4ZDFlZGQ3NTZiN2EwZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAxNjkyLDguNDk0MjcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDg1ZDE5MmFmZTU0YjY0OTczYjkwMGMzNDYyYTE5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYzUyODJlZjBiODE0MjA4OGVmZTQxNzY2NmMzNzdhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWM1MjgyZWYwYjgxNDIwODhlZmU0MTc2NjZjMzc3YTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdpc2JlcnRzY2hsZWljaEBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDA4NWQxOTJhZmU1NGI2NDk3M2I5MDBjMzQ2MmExOTcuc2V0Q29udGVudChodG1sXzFjNTI4MmVmMGI4MTQyMDg4ZWZlNDE3NjY2YzM3N2E0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RhYTFlOWJjY2Y3ZTRkMWJiOGQxZWRkNzU2YjdhMGY1LmJpbmRQb3B1cChwb3B1cF9kMDg1ZDE5MmFmZTU0YjY0OTczYjkwMGMzNDYyYTE5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YWVmMjljZGFmODQ0MzUxODAxZjJhYWMwYWVkNTlkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjk4NjA1LDguNDk0MDk2NDM1NjYzMDg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkMTAzNjI0Y2YyNDQxOGE5ZTM5MTg4YjM3MjEzZGYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk0NzMxYzViOTBkMjQ0YzY4NzhiNjIyNTk4MTAwODlhID0gJCgnPGRpdiBpZD0iaHRtbF85NDczMWM1YjkwZDI0NGM2ODc4YjYyMjU5ODEwMDg5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+eXdlaW5oYWdlQGJlaWVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDEwMzYyNGNmMjQ0MThhOWUzOTE4OGIzNzIxM2RmMi5zZXRDb250ZW50KGh0bWxfOTQ3MzFjNWI5MGQyNDRjNjg3OGI2MjI1OTgxMDA4OWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWFlZjI5Y2RhZjg0NDM1MTgwMWYyYWFjMGFlZDU5ZGQuYmluZFBvcHVwKHBvcHVwX2ZkMTAzNjI0Y2YyNDQxOGE5ZTM5MTg4YjM3MjEzZGYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0NDIwMDlhN2EyODRlM2I5MGY0YzFjMjVlOTZlNmI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTUyYjk4ZTMxYzAwNDdkYWI2NmM4MDNlNzBmMGQxYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjc3YmY5ZGZkNTc1NDkxZWIxOTQ3NzBhODViYmE1Y2IgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3N2JmOWRmZDU3NTQ5MWViMTk0NzcwYTg1YmJhNWNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ldmVseW5lbG9lZmZsZXJAcGFlcnR6ZWx0LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTJiOThlMzFjMDA0N2RhYjY2YzgwM2U3MGYwZDFiMC5zZXRDb250ZW50KGh0bWxfZjc3YmY5ZGZkNTc1NDkxZWIxOTQ3NzBhODViYmE1Y2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTQ0MjAwOWE3YTI4NGUzYjkwZjRjMWMyNWU5NmU2YjUuYmluZFBvcHVwKHBvcHVwX2U1MmI5OGUzMWMwMDQ3ZGFiNjZjODAzZTcwZjBkMWIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxNmUxMzVjMTk2ZTQ5MTVhYjYxNjAzMjNjM2U1Mjk3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2NzM2Myw4LjUxMDYwMDgyNDI4NjM1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82M2U0YmQxMTQyMTY0ZDgwYmI1OTljM2YxNTZlYzhiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMDE1YTNkNzcyYTA0OTExYTIxZjI1NWQ2YzMyMjk5YiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTAxNWEzZDc3MmEwNDkxMWEyMWYyNTVkNmMzMjI5OWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmZhYmlhbnRydWJAZ2VybGFjaC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYzZTRiZDExNDIxNjRkODBiYjU5OWMzZjE1NmVjOGI3LnNldENvbnRlbnQoaHRtbF9lMDE1YTNkNzcyYTA0OTExYTIxZjI1NWQ2YzMyMjk5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTZlMTM1YzE5NmU0OTE1YWI2MTYwMzIzYzNlNTI5Ny5iaW5kUG9wdXAocG9wdXBfNjNlNGJkMTE0MjE2NGQ4MGJiNTk5YzNmMTU2ZWM4YjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQ2MzNhODA3OTY2NGQ4N2EwNzk3ZmY2ODNkYTU4Y2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTU3Mjg4LDguNTA3MzU2MDAxNzM5ODY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkMjlmNjhiNTkzNjQwZWI4MWY0NWFhMmIzNjUzZThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5NTk5MDFlYTk3ZjQzYmY5YjZkOGUyOTE1MzQ5M2IyID0gJCgnPGRpdiBpZD0iaHRtbF83OTU5OTAxZWE5N2Y0M2JmOWI2ZDhlMjkxNTM0OTNiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Ym9sbmJhY2hlZGl0aGFAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWQyOWY2OGI1OTM2NDBlYjgxZjQ1YWEyYjM2NTNlOGUuc2V0Q29udGVudChodG1sXzc5NTk5MDFlYTk3ZjQzYmY5YjZkOGUyOTE1MzQ5M2IyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhkNjMzYTgwNzk2NjRkODdhMDc5N2ZmNjgzZGE1OGNmLmJpbmRQb3B1cChwb3B1cF85ZDI5ZjY4YjU5MzY0MGViODFmNDVhYTJiMzY1M2U4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYTljOWFjNzdiZWE0YjBmOTgwZDNjMTcyNzU5Zjg4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjYwNDE1LDguNTA4ODI1MDQwMTQ3OTI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ2M2NiZmVkZGY0YzRmMmI5NmVmYjgyYzA1ZDM4NjQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlMWVmZDI3OTQzZjQ4ODY5MDkxZmFmNDYwYjE1YWFhID0gJCgnPGRpdiBpZD0iaHRtbF8zZTFlZmQyNzk0M2Y0ODg2OTA5MWZhZjQ2MGIxNWFhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWVpc3Rlcm9saXZlckBzY2hlbmsuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NjNjYmZlZGRmNGM0ZjJiOTZlZmI4MmMwNWQzODY0Mi5zZXRDb250ZW50KGh0bWxfM2UxZWZkMjc5NDNmNDg4NjkwOTFmYWY0NjBiMTVhYWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWE5YzlhYzc3YmVhNGIwZjk4MGQzYzE3Mjc1OWY4ODQuYmluZFBvcHVwKHBvcHVwXzQ2M2NiZmVkZGY0YzRmMmI5NmVmYjgyYzA1ZDM4NjQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzOGUxZWY0MWVmYzQzNWE4MmY1N2M3ZDcxNmJiNmI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGU2MjkxM2FkODI3NGU1OGE1MzAzMTMwNzE4MDFiMTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNkYTU5YmNkMmVmNDU1OWI3OGI4MmI0MGQ3NWY2MGUgPSAkKCc8ZGl2IGlkPSJodG1sX2ZjZGE1OWJjZDJlZjQ1NTliNzhiODJiNDBkNzVmNjBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53YWxidXJnYWphY29iQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGU2MjkxM2FkODI3NGU1OGE1MzAzMTMwNzE4MDFiMTcuc2V0Q29udGVudChodG1sX2ZjZGE1OWJjZDJlZjQ1NTliNzhiODJiNDBkNzVmNjBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzOGUxZWY0MWVmYzQzNWE4MmY1N2M3ZDcxNmJiNmI0LmJpbmRQb3B1cChwb3B1cF8wZTYyOTEzYWQ4Mjc0ZTU4YTUzMDMxMzA3MTgwMWIxNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDI2MGNkZjQ3MGU0ZjVjYTJjYmZlOTRlODRiNjgyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NzI5NzYsOC41MDc5MDYyMDMyMTkxNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTkyM2ZmMTYyMzViNDE4NGI5NmJlYTkwMjBjMmQ2Y2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTAwOGM4Njc4YWJkNDVhYzgwZDY1NjM4MzE5MDcwOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzkwMDhjODY3OGFiZDQ1YWM4MGQ2NTYzODMxOTA3MDk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5jc3RleUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5MjNmZjE2MjM1YjQxODRiOTZiZWE5MDIwYzJkNmNmLnNldENvbnRlbnQoaHRtbF85MDA4Yzg2NzhhYmQ0NWFjODBkNjU2MzgzMTkwNzA5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMDI2MGNkZjQ3MGU0ZjVjYTJjYmZlOTRlODRiNjgyNC5iaW5kUG9wdXAocG9wdXBfZTkyM2ZmMTYyMzViNDE4NGI5NmJlYTkwMjBjMmQ2Y2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWY4MjUxM2FkNWQwNDdkNjkzYTAzMDEzYWEwOTdhMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMzMzk0LDguNTAyMDUyOTA3OTQ2NTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzOWQ0ZGY3YjI1MTRmZWZhYTRiN2ZiZTBkZDUwYjdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3ZTU1MWIxMDczZjRlM2Y5ZWIxYmI2Mzk2M2ZkZGFjID0gJCgnPGRpdiBpZD0iaHRtbF9lN2U1NTFiMTA3M2Y0ZTNmOWViMWJiNjM5NjNmZGRhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2VybmVybWFya0BtZW50emVsLm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjM5ZDRkZjdiMjUxNGZlZmFhNGI3ZmJlMGRkNTBiN2Muc2V0Q29udGVudChodG1sX2U3ZTU1MWIxMDczZjRlM2Y5ZWIxYmI2Mzk2M2ZkZGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVmODI1MTNhZDVkMDQ3ZDY5M2EwMzAxM2FhMDk3YTI5LmJpbmRQb3B1cChwb3B1cF8yMzlkNGRmN2IyNTE0ZmVmYWE0YjdmYmUwZGQ1MGI3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82N2ZjZDJmNzkyN2E0NTExYjU5ZmY1YWM5Y2Y1NzUyMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzQ4OTksOC40NzkyMTYyMzQ4OTIyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNThkODE5M2E5ZTEyNGFjOTlmYmFkOGI3NTNlMTMwYmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTg0MjRkOTA5YmQ5NGY3Y2I0YjhhYzIyM2Y3NzY2NzYgPSAkKCc8ZGl2IGlkPSJodG1sXzk4NDI0ZDkwOWJkOTRmN2NiNGI4YWMyMjNmNzc2Njc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yaGFydG1hbm5AcmluZy5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4ZDgxOTNhOWUxMjRhYzk5ZmJhZDhiNzUzZTEzMGJiLnNldENvbnRlbnQoaHRtbF85ODQyNGQ5MDliZDk0ZjdjYjRiOGFjMjIzZjc3NjY3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82N2ZjZDJmNzkyN2E0NTExYjU5ZmY1YWM5Y2Y1NzUyMC5iaW5kUG9wdXAocG9wdXBfNThkODE5M2E5ZTEyNGFjOTlmYmFkOGI3NTNlMTMwYmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM5Mzc0YmYxMjY2NGYyZWI5OWY1YTBmYWNjM2FiMjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTgwOTQwNSw4LjUwNjQyMTAxODI3MDI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjg3Y2I2ZGU5NWQ0ZTBkOGRlNzc3NWQyYjFmMGU3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZWRhNjk4OGUxM2I0NzFkYTg0MjA4YzE1ZGEzOWUyYyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2VkYTY5ODhlMTNiNDcxZGE4NDIwOGMxNWRhMzllMmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmZiaW5uZXJAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjI4N2NiNmRlOTVkNGUwZDhkZTc3NzVkMmIxZjBlN2Uuc2V0Q29udGVudChodG1sXzdlZGE2OTg4ZTEzYjQ3MWRhODQyMDhjMTVkYTM5ZTJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzczOTM3NGJmMTI2NjRmMmViOTlmNWEwZmFjYzNhYjIwLmJpbmRQb3B1cChwb3B1cF8yMjg3Y2I2ZGU5NWQ0ZTBkOGRlNzc3NWQyYjFmMGU3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODU4OTI5OWU2ZTQ0YmQ4ODA2NDllOTgyMWI0YzdkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjU2OTgsOC40OTE4NTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyMjA3NjhkMGMxYTQ3NDhhZWYyZTNjMGE2MGE5ZjY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhZDEzMGNlYTVjNDQ0OGRiM2MxNzM5MWQ4NjgwMjkzID0gJCgnPGRpdiBpZD0iaHRtbF9jYWQxMzBjZWE1YzQ0NDhkYjNjMTczOTFkODY4MDI5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2NodWVsZXJyb25hbGRAbmFzZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjIwNzY4ZDBjMWE0NzQ4YWVmMmUzYzBhNjBhOWY2NS5zZXRDb250ZW50KGh0bWxfY2FkMTMwY2VhNWM0NDQ4ZGIzYzE3MzkxZDg2ODAyOTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTg1ODkyOTllNmU0NGJkODgwNjQ5ZTk4MjFiNGM3ZGUuYmluZFBvcHVwKHBvcHVwX2YyMjA3NjhkMGMxYTQ3NDhhZWYyZTNjMGE2MGE5ZjY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1NTdjNGYxNTg2ZjQ5YWJiYjM0NDUwM2RkMzljM2UyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2Nzg1MTUwMDAwMDA1LDguNDg5OTUxMjEwMzQ1MzQzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0MGYxYmYyYzI1YzQwMWRhNTM3NWI3NGVlOTNjZjQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2YWJhM2E5ZTVhNzQ2Y2M4NmMyNjUyYTdlNmFmODIyID0gJCgnPGRpdiBpZD0iaHRtbF80NmFiYTNhOWU1YTc0NmNjODZjMjY1MmE3ZTZhZjgyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2llcnNjaG5lcmFsZnJlZG9AZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0MGYxYmYyYzI1YzQwMWRhNTM3NWI3NGVlOTNjZjQzLnNldENvbnRlbnQoaHRtbF80NmFiYTNhOWU1YTc0NmNjODZjMjY1MmE3ZTZhZjgyMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNTU3YzRmMTU4NmY0OWFiYmIzNDQ1MDNkZDM5YzNlMi5iaW5kUG9wdXAocG9wdXBfYTQwZjFiZjJjMjVjNDAxZGE1Mzc1Yjc0ZWU5M2NmNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzNkZmU5YmNiMDNlNGExNWJmNGNjM2IwYTZkMjE3YjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY3MjQsOC40OTU2MzQwNjMyMzQ2MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWZkMmFmNGY5OTgwNDAzY2I1NGRjMDllZWE1MDJkNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTA4YWNiYTY3ZmFlNDI4MWEwYzNmODM0YWU1NWEwOTQgPSAkKCc8ZGl2IGlkPSJodG1sX2UwOGFjYmE2N2ZhZTQyODFhMGMzZjgzNGFlNTVhMDk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5pc2FiZWxsYTUzQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmZDJhZjRmOTk4MDQwM2NiNTRkYzA5ZWVhNTAyZDRhLnNldENvbnRlbnQoaHRtbF9lMDhhY2JhNjdmYWU0MjgxYTBjM2Y4MzRhZTU1YTA5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zM2RmZTliY2IwM2U0YTE1YmY0Y2MzYjBhNmQyMTdiNC5iaW5kUG9wdXAocG9wdXBfYWZkMmFmNGY5OTgwNDAzY2I1NGRjMDllZWE1MDJkNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODE4Y2YwNmFkOWZjNGUwZDg3MTA1ZWEyNTU1ZmYwNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDU1MzMxLDguNDk4MjgwMzA4MTgxMDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxODFiNzUxOThlMzQxYTU5MDZiZTIyYjQ0OWZjM2ZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkNTk0NDcwOTI0MjQ4YWI4NWRkMTE5NjgwMDc5OTA0ID0gJCgnPGRpdiBpZD0iaHRtbF9kZDU5NDQ3MDkyNDI0OGFiODVkZDExOTY4MDA3OTkwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aG1hbnNAdHJvZXN0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzE4MWI3NTE5OGUzNDFhNTkwNmJlMjJiNDQ5ZmMzZmUuc2V0Q29udGVudChodG1sX2RkNTk0NDcwOTI0MjQ4YWI4NWRkMTE5NjgwMDc5OTA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgxOGNmMDZhZDlmYzRlMGQ4NzEwNWVhMjU1NWZmMDQ4LmJpbmRQb3B1cChwb3B1cF83MTgxYjc1MTk4ZTM0MWE1OTA2YmUyMmI0NDlmYzNmZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNTdmMjI2YmZkZWY0ZjBmOTQ4ZmQxMDNmODEwMjE4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzk3NzQ1LDguNDk4MzIwMDgwNzY4NzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1NzYxNzEzMjBmNDQ1M2NiOGMyNGIxNGFlYmViNGZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlNzQzYWI5N2RiYzRkZmI5MmRmODZmNmRjNjQ3ZDJiID0gJCgnPGRpdiBpZD0iaHRtbF83ZTc0M2FiOTdkYmM0ZGZiOTJkZjg2ZjZkYzY0N2QyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2VybGFjaGdlcmhhcmR0QGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTU3NjE3MTMyMGY0NDUzY2I4YzI0YjE0YWViZWI0ZmMuc2V0Q29udGVudChodG1sXzdlNzQzYWI5N2RiYzRkZmI5MmRmODZmNmRjNjQ3ZDJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1N2YyMjZiZmRlZjRmMGY5NDhmZDEwM2Y4MTAyMTg2LmJpbmRQb3B1cChwb3B1cF8xNTc2MTcxMzIwZjQ0NTNjYjhjMjRiMTRhZWJlYjRmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNGQyMGUyZDk2Yzk0MmUxYTcxMzJkYmIzY2QwMzMzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMTA0ODA1MDAwMDAwNSw4LjQ4NzAzMDkxNTk4NTcwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDg1ZTIzNmViMTA0MTFlODc1YTcyNDZlYjk2MTM1NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMDNlYTU1M2M2NGY0MDM4OThlMGMzZmZlZjNhMmQ4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjAzZWE1NTNjNjRmNDAzODk4ZTBjM2ZmZWYzYTJkODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhhcmR5NjhAYm9sem1hbm4uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0ODVlMjM2ZWIxMDQxMWU4NzVhNzI0NmViOTYxMzU0LnNldENvbnRlbnQoaHRtbF9iMDNlYTU1M2M2NGY0MDM4OThlMGMzZmZlZjNhMmQ4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNGQyMGUyZDk2Yzk0MmUxYTcxMzJkYmIzY2QwMzMzZS5iaW5kUG9wdXAocG9wdXBfZTQ4NWUyMzZlYjEwNDExZTg3NWE3MjQ2ZWI5NjEzNTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTE2MmIwYmNiZmY4NDVlZWE0MjMyZmY1NDNjZWNmNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDczNTY2NSw4LjQ5NTE0MjMxOTY3MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I5ZDFlNWUyMWU0MzRhZjc5ZGVjMTRlNWRiMzk4MjEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhYzJjNDMyYTcxNzQ4NGE4MzMzNjJlY2Q4ZWY0ZDU3ID0gJCgnPGRpdiBpZD0iaHRtbF8yYWMyYzQzMmE3MTc0ODRhODMzMzYyZWNkOGVmNGQ1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aHVnbzMzQGJvbGFuZGVyLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjlkMWU1ZTIxZTQzNGFmNzlkZWMxNGU1ZGIzOTgyMTIuc2V0Q29udGVudChodG1sXzJhYzJjNDMyYTcxNzQ4NGE4MzMzNjJlY2Q4ZWY0ZDU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxNjJiMGJjYmZmODQ1ZWVhNDIzMmZmNTQzY2VjZjc2LmJpbmRQb3B1cChwb3B1cF9iOWQxZTVlMjFlNDM0YWY3OWRlYzE0ZTVkYjM5ODIxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZTVkN2Q2MzEyZTg0OWM5YTg0YTZiYzlmMGE2YWJlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzI0NTI1LDguNDkyMzE2OTkyMjk0NDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmY0ODRkM2JhMzY3NDIwZTlhOGYzODBmZDk4Y2QyMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdkNjA0YWZkZTdhNDUxODkzOTRiMjhhYzdiZTRiYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzE3ZDYwNGFmZGU3YTQ1MTg5Mzk0YjI4YWM3YmU0YmFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tb2VjaGxpY2hlbmxqdWJpY2FAd2llbG9jaC5vcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmNDg0ZDNiYTM2NzQyMGU5YThmMzgwZmQ5OGNkMjE0LnNldENvbnRlbnQoaHRtbF8xN2Q2MDRhZmRlN2E0NTE4OTM5NGIyOGFjN2JlNGJhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZTVkN2Q2MzEyZTg0OWM5YTg0YTZiYzlmMGE2YWJlMi5iaW5kUG9wdXAocG9wdXBfZmY0ODRkM2JhMzY3NDIwZTlhOGYzODBmZDk4Y2QyMTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTI2Y2VkZjFmMDkzNGQyMGE1NmNkMWIyYjExOTE4MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDc0NTM3LDguNDg4MzI4OTI4MDEyMDQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwODg0ZjYzNTY5YzRiNGRhZjVkMjU0NGIwOGU2M2U0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmZGIzNDRiYzlhMjQwYzk5MGMwYmM3NDdlNDE0YjQ3ID0gJCgnPGRpdiBpZD0iaHRtbF85ZmRiMzQ0YmM5YTI0MGM5OTBjMGJjNzQ3ZTQxNGI0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bG90dGk0NkBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwODg0ZjYzNTY5YzRiNGRhZjVkMjU0NGIwOGU2M2U0LnNldENvbnRlbnQoaHRtbF85ZmRiMzQ0YmM5YTI0MGM5OTBjMGJjNzQ3ZTQxNGI0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjZjZWRmMWYwOTM0ZDIwYTU2Y2QxYjJiMTE5MTgzNC5iaW5kUG9wdXAocG9wdXBfODA4ODRmNjM1NjljNGI0ZGFmNWQyNTQ0YjA4ZTYzZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzcwNTI4NWVhZDVmNGQ4N2FjOGFkN2Y4OGU2MGIwNjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTU1NzE3NSw4LjUxNDIwOTk1MDQwMDgxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZGI4MzllNzkwMjQ0Zjc1OGE4ZTk5OTU2OWJkZGNiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zM2NjNjE4MGY2M2Y0NDMxYTk1OGI4ODdmMGJjNGEwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzNjYzYxODBmNjNmNDQzMWE5NThiODg3ZjBiYzRhMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNrYWJ1c0Bnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWRiODM5ZTc5MDI0NGY3NThhOGU5OTk1NjliZGRjYjkuc2V0Q29udGVudChodG1sXzMzY2M2MTgwZjYzZjQ0MzFhOTU4Yjg4N2YwYmM0YTAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3MDUyODVlYWQ1ZjRkODdhYzhhZDdmODhlNjBiMDYyLmJpbmRQb3B1cChwb3B1cF9hZGI4MzllNzkwMjQ0Zjc1OGE4ZTk5OTU2OWJkZGNiOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MDg3MjJlNjc4NjY0NDNhOGQ5YThkMDk0YWUwM2M5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzI3NDg1LDguNTAzODg1ODUxMTI2NTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmE4MDRhOTc3YmM2NGUyOTg4NjcwYzZmMjI0Y2MyNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDVlODZmODI4MGU3NGZhN2I2NWFmYzc0NDYzODM5MWMgPSAkKCc8ZGl2IGlkPSJodG1sX2Q1ZTg2ZjgyODBlNzRmYTdiNjVhZmM3NDQ2MzgzOTFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ib3Vjc2Vpbmthcmwtam9zZWZAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhODA0YTk3N2JjNjRlMjk4ODY3MGM2ZjIyNGNjMjU1LnNldENvbnRlbnQoaHRtbF9kNWU4NmY4MjgwZTc0ZmE3YjY1YWZjNzQ0NjM4MzkxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MDg3MjJlNjc4NjY0NDNhOGQ5YThkMDk0YWUwM2M5Mi5iaW5kUG9wdXAocG9wdXBfNmE4MDRhOTc3YmM2NGUyOTg4NjcwYzZmMjI0Y2MyNTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNkNGUyMzYyZGY2NDI5ZTg0ZjQyZWJkYTE3MWJkYTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1MjczLDguNDkyNTM3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYjg0YmRhNzU1MWM0OTVlOTg0MTc2ZmJmMWQ2YTNmNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNWQwZDAxZjJhMDc0YTFmYTQ1ODdlYzY4NjU1NWQyOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTVkMGQwMWYyYTA3NGExZmE0NTg3ZWM2ODY1NTVkMjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5ldXNjaGFlZmVyZW1pbEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGI4NGJkYTc1NTFjNDk1ZTk4NDE3NmZiZjFkNmEzZjQuc2V0Q29udGVudChodG1sXzE1ZDBkMDFmMmEwNzRhMWZhNDU4N2VjNjg2NTU1ZDI5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjZDRlMjM2MmRmNjQyOWU4NGY0MmViZGExNzFiZGEzLmJpbmRQb3B1cChwb3B1cF8wYjg0YmRhNzU1MWM0OTVlOTg0MTc2ZmJmMWQ2YTNmNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83N2VjMjVkMzJlYzQ0NTVmOGEwNWNiNzg5NzVlZjM5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNDA2OTQ1LDguNDgwMzY2NzE5MjQ1MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiZGM5NDY5OTM3MTQzMTZiMjBmY2I3ZjRiNTRiMDk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1ZjNmOWNiYTZmYzQxOWViMWM0ODFkNWIzMDg4ZDU5ID0gJCgnPGRpdiBpZD0iaHRtbF9iNWYzZjljYmE2ZmM0MTllYjFjNDgxZDViMzA4OGQ1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2Nob2VubGFuZG5hdGFsaWFAaGVzZXIubmV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYmRjOTQ2OTkzNzE0MzE2YjIwZmNiN2Y0YjU0YjA5NS5zZXRDb250ZW50KGh0bWxfYjVmM2Y5Y2JhNmZjNDE5ZWIxYzQ4MWQ1YjMwODhkNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzdlYzI1ZDMyZWM0NDU1ZjhhMDVjYjc4OTc1ZWYzOWIuYmluZFBvcHVwKHBvcHVwX2RiZGM5NDY5OTM3MTQzMTZiMjBmY2I3ZjRiNTRiMDk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1NDdmZmNkNDUyYzRjZjBiOTk4NjhlZTRiNjJiYzkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEwNTY2OSw4LjQ4MzYyMDA2ODg5NTkwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYzdmYmE0MmU0MTk0MWEzOTVlNTI3NWRmOWYzNGExOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMWQyZDBmZTczMzA0NTJmODc4YzgwM2NhMWFmMDBiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjFkMmQwZmU3MzMwNDUyZjg3OGM4MDNjYTFhZjAwYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1hcmxpZXNld2Vpc3NAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzdmYmE0MmU0MTk0MWEzOTVlNTI3NWRmOWYzNGExOS5zZXRDb250ZW50KGh0bWxfMjFkMmQwZmU3MzMwNDUyZjg3OGM4MDNjYTFhZjAwYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU0N2ZmY2Q0NTJjNGNmMGI5OTg2OGVlNGI2MmJjOTAuYmluZFBvcHVwKHBvcHVwX2ZjN2ZiYTQyZTQxOTQxYTM5NWU1Mjc1ZGY5ZjM0YTE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0M2FmZjBmNjJjMzQ5Mzk5YzdiYmE0MDQ2NjgzOGM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTM2OSw4LjQ5Mjk2MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDkyMWY4MjVmYzdmNGRmYjhkMGZkYTg0MmIxZDRhMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTIxNzk5Y2Q3YjFkNGJiNWIzYTIzY2Y3NGM4NDljNmMgPSAkKCc8ZGl2IGlkPSJodG1sXzkyMTc5OWNkN2IxZDRiYjViM2EyM2NmNzRjODQ5YzZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zYWV1YmVybGljaGhhbnMtd2lsbGlAcmVpbmhhcmR0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDkyMWY4MjVmYzdmNGRmYjhkMGZkYTg0MmIxZDRhMjkuc2V0Q29udGVudChodG1sXzkyMTc5OWNkN2IxZDRiYjViM2EyM2NmNzRjODQ5YzZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0M2FmZjBmNjJjMzQ5Mzk5YzdiYmE0MDQ2NjgzOGM5LmJpbmRQb3B1cChwb3B1cF80OTIxZjgyNWZjN2Y0ZGZiOGQwZmRhODQyYjFkNGEyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODkwZTZhNjM5OGM0ZjhkOTI2ZDdlNjYyYmU1ZDFkZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzUxMjEsOC40Nzg2ODk3NTQ4OTc1NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjU3Njk4ZDQ3ZmZkNDgzZWI2MDNmMDE1M2UyZWRlMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzJmNWNhYjdhZWY3NDk4Yzk0NzNjZWI4OWU1ZDhhOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzMyZjVjYWI3YWVmNzQ5OGM5NDczY2ViODllNWQ4YTk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53aWxtc2Vua2Fyb2xhQHNhZXViZXJsaWNoLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjU3Njk4ZDQ3ZmZkNDgzZWI2MDNmMDE1M2UyZWRlMjEuc2V0Q29udGVudChodG1sXzMyZjVjYWI3YWVmNzQ5OGM5NDczY2ViODllNWQ4YTk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I4OTBlNmE2Mzk4YzRmOGQ5MjZkN2U2NjJiZTVkMWRkLmJpbmRQb3B1cChwb3B1cF9mNTc2OThkNDdmZmQ0ODNlYjYwM2YwMTUzZTJlZGUyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOGVhNWRjODA2MjQ0MzQ0YTZiY2FmYmJkZmU2M2M3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzQ5MjQsOC40OTczNDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjZTFlOWZjY2RmYzRhYWJhMDQ1ZjY0OWE1MjZiNjkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmOTY0YWJkMWQwNTQ2NGNiY2RkYjBlMmQ0MmYxODMzID0gJCgnPGRpdiBpZD0iaHRtbF8zZjk2NGFiZDFkMDU0NjRjYmNkZGIwZTJkNDJmMTgzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aXJpczM4QGJleWVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lY2UxZTlmY2NkZmM0YWFiYTA0NWY2NDlhNTI2YjY5Mi5zZXRDb250ZW50KGh0bWxfM2Y5NjRhYmQxZDA1NDY0Y2JjZGRiMGUyZDQyZjE4MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMThlYTVkYzgwNjI0NDM0NGE2YmNhZmJiZGZlNjNjNzQuYmluZFBvcHVwKHBvcHVwX2VjZTFlOWZjY2RmYzRhYWJhMDQ1ZjY0OWE1MjZiNjkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyZTNiOWFkOWEyNDQ2NjhiMDYwMjg0ZDhmZjljYjI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE2NjIzLDguNDgxMzYzNzIzMDIzMjU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY4M2NhMThmYmRhNTQzNzdhZDYyNjRiMzg2MDkzNzI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2OTk2NTM0YmFlNjQxZGZiODgxMDVhZjYzYzM2ZjZiID0gJCgnPGRpdiBpZD0iaHRtbF82Njk5NjUzNGJhZTY0MWRmYjg4MTA1YWY2M2MzNmY2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3JhdXNlZXJkb2dhbkBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4M2NhMThmYmRhNTQzNzdhZDYyNjRiMzg2MDkzNzI3LnNldENvbnRlbnQoaHRtbF82Njk5NjUzNGJhZTY0MWRmYjg4MTA1YWY2M2MzNmY2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MmUzYjlhZDlhMjQ0NjY4YjA2MDI4NGQ4ZmY5Y2IyOS5iaW5kUG9wdXAocG9wdXBfNjgzY2ExOGZiZGE1NDM3N2FkNjI2NGIzODYwOTM3MjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGY0YTg2YTQ3MmE3NDk2NWJkOGFkMjE0YjdmNjc4ZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDU0MjAxLDguNDk4Njg1NTQwODIzNjY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3NTM0ZmJiNTcxMzRhOTBhZTgxMWY2NmRiYzFhYjAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhYjkwZTM4M2MyMTQ2NzQ4ZTQyNWYxYzY3N2Y1OWM3ID0gJCgnPGRpdiBpZD0iaHRtbF8wYWI5MGUzODNjMjE0Njc0OGU0MjVmMWM2NzdmNTljNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cnVwcGVyc2JlcmdlcnN5bHZpZUBzY2hpbmtlLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzUzNGZiYjU3MTM0YTkwYWU4MTFmNjZkYmMxYWIwMi5zZXRDb250ZW50KGh0bWxfMGFiOTBlMzgzYzIxNDY3NDhlNDI1ZjFjNjc3ZjU5YzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGY0YTg2YTQ3MmE3NDk2NWJkOGFkMjE0YjdmNjc4ZGMuYmluZFBvcHVwKHBvcHVwXzE3NTM0ZmJiNTcxMzRhOTBhZTgxMWY2NmRiYzFhYjAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxYzc1ZThhOWVjYTQwZmI5N2FhMGNkMTk4YjE2ZGI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk3Nzg5MSw4LjUxMTU4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjI3NWMyNDQ3YjA3NGNhNzlhNTQ0YjMyNDcwYWIxNDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWNiYTY4NTU0ZDE5NGM4ZTk5MmY2Y2E3YzVjY2Y3YzYgPSAkKCc8ZGl2IGlkPSJodG1sXzVjYmE2ODU1NGQxOTRjOGU5OTJmNmNhN2M1Y2NmN2M2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zY2hlZWxyb3NlbGluZGVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMjc1YzI0NDdiMDc0Y2E3OWE1NDRiMzI0NzBhYjE0NS5zZXRDb250ZW50KGh0bWxfNWNiYTY4NTU0ZDE5NGM4ZTk5MmY2Y2E3YzVjY2Y3YzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjFjNzVlOGE5ZWNhNDBmYjk3YWEwY2QxOThiMTZkYjkuYmluZFBvcHVwKHBvcHVwX2YyNzVjMjQ0N2IwNzRjYTc5YTU0NGIzMjQ3MGFiMTQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5YWI5MjFkMzg1MDQ5NTk4N2M3NmJkZjEwMzJmNTAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwNjcwNCw4LjUwNzc4OTk1MjM5NDQ1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZDU2YjM1MTA0ZTE0ZDA5OTZjMDNhMjkzZmRjOTcxMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYWFkMTg2MDJmYzE0MWJhYTRjMTg3YWIwYTljYzg2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWFhZDE4NjAyZmMxNDFiYWE0YzE4N2FiMGE5Y2M4NjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmd1ZW50ZXJnb3R0aGFyZEBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkNTZiMzUxMDRlMTRkMDk5NmMwM2EyOTNmZGM5NzExLnNldENvbnRlbnQoaHRtbF9hYWFkMTg2MDJmYzE0MWJhYTRjMTg3YWIwYTljYzg2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OWFiOTIxZDM4NTA0OTU5ODdjNzZiZGYxMDMyZjUwMy5iaW5kUG9wdXAocG9wdXBfOGQ1NmIzNTEwNGUxNGQwOTk2YzAzYTI5M2ZkYzk3MTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTc3Yzc2ZmU1MmY3NGZlNGE1YTIzZjJjYTY2MmY4NDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM5Nzc0NSw4LjQ5ODMyMDA4MDc2ODcyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzI3YTFjYmY4NTI0ZmZmYWQ1MmM3Njk4MTg3OGVjMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTJlOWU4YjQ3ZTI0NjIxYjg1NmRiZDkyYjJhN2FhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2EyZTllOGI0N2UyNDYyMWI4NTZkYmQ5MmIyYTdhYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFuZ2VsaWNhYmxvY2hAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzI3YTFjYmY4NTI0ZmZmYWQ1MmM3Njk4MTg3OGVjMS5zZXRDb250ZW50KGh0bWxfY2EyZTllOGI0N2UyNDYyMWI4NTZkYmQ5MmIyYTdhYTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTc3Yzc2ZmU1MmY3NGZlNGE1YTIzZjJjYTY2MmY4NDUuYmluZFBvcHVwKHBvcHVwX2JjMjdhMWNiZjg1MjRmZmZhZDUyYzc2OTgxODc4ZWMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NhY2NmYWM2NzMxZjRjMzhiNWJiNDQzYzA2MDQ0YjJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDExNTkyMjk5OTk5OTk1LDguNDg1NTc4NzI2NDM3NjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyNTJmMWRiZTllNDRiYzM5ZTExYzFjNDc5OTU5OTcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkNDIyYmFjYjk4YTQ2YTY4NmYxZGFhYWM0N2RkMjdkID0gJCgnPGRpdiBpZD0iaHRtbF84ZDQyMmJhY2I5OGE0NmE2ODZmMWRhYWFjNDdkZDI3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+eHNjaHVlbGVyQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjI1MmYxZGJlOWU0NGJjMzllMTFjMWM0Nzk5NTk5NzEuc2V0Q29udGVudChodG1sXzhkNDIyYmFjYjk4YTQ2YTY4NmYxZGFhYWM0N2RkMjdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhY2NmYWM2NzMxZjRjMzhiNWJiNDQzYzA2MDQ0YjJhLmJpbmRQb3B1cChwb3B1cF9mMjUyZjFkYmU5ZTQ0YmMzOWUxMWMxYzQ3OTk1OTk3MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMTQ3NWY5YjA0ZTc0Yjk3OTMwY2NiNmRiYWZmYmQ5ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzA1NDU1LDguNDc5NTUyNzY1NDI5MTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxNTdlY2QwMDJkNzRlMzhhMjg0MGI3ZGNkNzEyNGQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmY2RmZWM0Mzg3ZTQ1N2VhOTBjOTk3NGU0MTBjZjQ4ID0gJCgnPGRpdiBpZD0iaHRtbF8wZmNkZmVjNDM4N2U0NTdlYTkwYzk5NzRlNDEwY2Y0OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2lydGhoZW5yeWtAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxNTdlY2QwMDJkNzRlMzhhMjg0MGI3ZGNkNzEyNGQ0LnNldENvbnRlbnQoaHRtbF8wZmNkZmVjNDM4N2U0NTdlYTkwYzk5NzRlNDEwY2Y0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMTQ3NWY5YjA0ZTc0Yjk3OTMwY2NiNmRiYWZmYmQ5Zi5iaW5kUG9wdXAocG9wdXBfMDE1N2VjZDAwMmQ3NGUzOGEyODQwYjdkY2Q3MTI0ZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTJkY2M1NjYzYTE0NGU3MmI3YjlmODA3Y2M0MzBmMmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDEwNjc5OTk5OTk5OTUsOC40OTg2NjA5MDAwNTg0NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTMxZDllNDRmYjM3NDNiZmI0ZTAxNTk2ZWI1N2E4NjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjdlNWQ4MWFjZjRhNDkxYWI2NDY5YzkzNDllM2E3ODIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3ZTVkODFhY2Y0YTQ5MWFiNjQ2OWM5MzQ5ZTNhNzgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zZWxtYWF1c3Rlcm11ZWhsZUBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTMxZDllNDRmYjM3NDNiZmI0ZTAxNTk2ZWI1N2E4NjIuc2V0Q29udGVudChodG1sX2Y3ZTVkODFhY2Y0YTQ5MWFiNjQ2OWM5MzQ5ZTNhNzgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyZGNjNTY2M2ExNDRlNzJiN2I5ZjgwN2NjNDMwZjJmLmJpbmRQb3B1cChwb3B1cF85MzFkOWU0NGZiMzc0M2JmYjRlMDE1OTZlYjU3YTg2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDQ1Yjg5MjdiZjI0NDRiOGU0NjM4MzhkMWRhZjdkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjA4MTQsOC41MDYxNDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhN2M5NDcyZDU4ZjQ2ZTRhMmVjNDJhOTAzYTc5NGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiZjc2YWQzOTMzODQ1NTJhNjAyZWFlODZiZGM0MjA3ID0gJCgnPGRpdiBpZD0iaHRtbF8wYmY3NmFkMzkzMzg0NTUyYTYwMmVhZTg2YmRjNDIwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cnVwcGVydGNvbnN0YW5jZUBiYXJ0aC5vcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhN2M5NDcyZDU4ZjQ2ZTRhMmVjNDJhOTAzYTc5NGYwLnNldENvbnRlbnQoaHRtbF8wYmY3NmFkMzkzMzg0NTUyYTYwMmVhZTg2YmRjNDIwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDQ1Yjg5MjdiZjI0NDRiOGU0NjM4MzhkMWRhZjdkMi5iaW5kUG9wdXAocG9wdXBfNWE3Yzk0NzJkNThmNDZlNGEyZWM0MmE5MDNhNzk0ZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzJjNjJiNTEwY2Q1NDUwMDlhMTZmNzNlMjIxYTY0ZTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcwNTQ1NSw4LjQ3OTU1Mjc2NTQyOTEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMzhjNWYxYjRiMWY0ZWIxYWJmNmIzMzA4NWM3Njk3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NTdkMTU3YzZiNTA0MTg0YmFkNmM1MTM2MDAyZmQ0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfODU3ZDE1N2M2YjUwNDE4NGJhZDZjNTEzNjAwMmZkNGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmZsYW50emVtaW5lQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjM4YzVmMWI0YjFmNGViMWFiZjZiMzMwODVjNzY5N2Euc2V0Q29udGVudChodG1sXzg1N2QxNTdjNmI1MDQxODRiYWQ2YzUxMzYwMDJmZDRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyYzYyYjUxMGNkNTQ1MDA5YTE2ZjczZTIyMWE2NGUzLmJpbmRQb3B1cChwb3B1cF9iMzhjNWYxYjRiMWY0ZWIxYWJmNmIzMzA4NWM3Njk3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NjY4MzFhMDliZjc0NjFkOGRkYzAxOWQxZmE1ZDdkNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTE3MjEsOC40OTc4NDUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZDliZGZiODVjYjM0ODk1ODFiMDUyOWZhNGMxNTQxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZWRlNjBkOWI0NmI0YmUzODU0ZTJmMTgyNTRhMjVjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmVkZTYwZDliNDZiNGJlMzg1NGUyZjE4MjU0YTI1YzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhvZmZtYW5uY2VudGFAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZDliZGZiODVjYjM0ODk1ODFiMDUyOWZhNGMxNTQxNi5zZXRDb250ZW50KGh0bWxfZmVkZTYwZDliNDZiNGJlMzg1NGUyZjE4MjU0YTI1YzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDY2ODMxYTA5YmY3NDYxZDhkZGMwMTlkMWZhNWQ3ZDQuYmluZFBvcHVwKHBvcHVwX2JkOWJkZmI4NWNiMzQ4OTU4MWIwNTI5ZmE0YzE1NDE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxNGZiZGMxMTNmNDRlN2ZiOGQ0Mzk5NTI2ODA0NWEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MjEzODUsOC40OTQyOTY0MDA0NjI3NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWYyYWJmYTJhN2UxNDkzNWJjMTQyNjE0YjQyMTg5ODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmRlZmVmMTBiOGZlNDlmMThjODM0ZWM4ZDFlZDU1OGQgPSAkKCc8ZGl2IGlkPSJodG1sX2JkZWZlZjEwYjhmZTQ5ZjE4YzgzNGVjOGQxZWQ1NThkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5jb3JkOThAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmMmFiZmEyYTdlMTQ5MzViYzE0MjYxNGI0MjE4OTg3LnNldENvbnRlbnQoaHRtbF9iZGVmZWYxMGI4ZmU0OWYxOGM4MzRlYzhkMWVkNTU4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTRmYmRjMTEzZjQ0ZTdmYjhkNDM5OTUyNjgwNDVhMi5iaW5kUG9wdXAocG9wdXBfNWYyYWJmYTJhN2UxNDkzNWJjMTQyNjE0YjQyMTg5ODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjVjZTI0YWJlNmE2NGI0NDkyOTM2ZjRjNjdjMjMxYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDc1MTA0LDguNDg1OTMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOWNhZTViOWRmZGY0ZmUwODdhNDZlN2YzOGUzZDg4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMTMwOGZhNDhhZjg0NzBlYjk1MGRkZDkwZTE0MzAwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTEzMDhmYTQ4YWY4NDcwZWI5NTBkZGQ5MGUxNDMwMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmRlbm55NDhAaGVsbHdpZy5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDljYWU1YjlkZmRmNGZlMDg3YTQ2ZTdmMzhlM2Q4ODIuc2V0Q29udGVudChodG1sXzExMzA4ZmE0OGFmODQ3MGViOTUwZGRkOTBlMTQzMDBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I1Y2UyNGFiZTZhNjRiNDQ5MjkzNmY0YzY3YzIzMWIzLmJpbmRQb3B1cChwb3B1cF8wOWNhZTViOWRmZGY0ZmUwODdhNDZlN2YzOGUzZDg4Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNDRkMTk5ZDkzMTg0NWIyOTg5ZGQwNGVlNDgwMThiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTU3OTYsOC41MDM0NTY1NzgxMzM2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWUzZWExOTM0NmI4NDZiNjllNmQyYzc5ZTQ5YzVmNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA1OTIzMGE4MWZmNDZiYzgzMzU2NzliZjcyYTAwYTcgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNTkyMzBhODFmZjQ2YmM4MzM1Njc5YmY3MmEwMGE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5qYW5uYTc3QGdpZXNzLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZTNlYTE5MzQ2Yjg0NmI2OWU2ZDJjNzllNDljNWY1Yi5zZXRDb250ZW50KGh0bWxfNzA1OTIzMGE4MWZmNDZiYzgzMzU2NzliZjcyYTAwYTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDQ0ZDE5OWQ5MzE4NDViMjk4OWRkMDRlZTQ4MDE4YjYuYmluZFBvcHVwKHBvcHVwXzVlM2VhMTkzNDZiODQ2YjY5ZTZkMmM3OWU0OWM1ZjViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlZDQ1NDljMTkwODRlM2NiNzEzOTBkNGZlZTUwODcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE2NDY5Myw4LjQ4MjMyMjI0ODI4NzQwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzQxM2ZhNzcxZGE0Mjg4YTg0YjZlYjVlZTZhZTZmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmI1NmUxYjkzM2U0M2UwOTBmNjc2ZDRhODI5ZGEwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJiNTZlMWI5MzNlNDNlMDkwZjY3NmQ0YTgyOWRhMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5hc2VyZGFnb2JlcnRAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3NDEzZmE3NzFkYTQyODhhODRiNmViNWVlNmFlNmZlLnNldENvbnRlbnQoaHRtbF9kYmI1NmUxYjkzM2U0M2UwOTBmNjc2ZDRhODI5ZGEwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZWQ0NTQ5YzE5MDg0ZTNjYjcxMzkwZDRmZWU1MDg3MS5iaW5kUG9wdXAocG9wdXBfODc0MTNmYTc3MWRhNDI4OGE4NGI2ZWI1ZWU2YWU2ZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzZmMWVlYjU2OGU5NDhkYzg2YjI4NDA1Mjg5ZTExY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1MjczLDguNDkyNTM3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMmZjYmVhMjljODc0ZGRiYjUxZWU4ZTcwNTc5N2EyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ODliNzRjY2NlZDU0NzljYThjOTMzMjAzZWMzZGZjYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDg5Yjc0Y2NjZWQ1NDc5Y2E4YzkzMzIwM2VjM2RmY2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFobWFkZGlwcGVsQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjJmY2JlYTI5Yzg3NGRkYmI1MWVlOGU3MDU3OTdhMjIuc2V0Q29udGVudChodG1sXzQ4OWI3NGNjY2VkNTQ3OWNhOGM5MzMyMDNlYzNkZmNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2ZjFlZWI1NjhlOTQ4ZGM4NmIyODQwNTI4OWUxMWNhLmJpbmRQb3B1cChwb3B1cF9mMmZjYmVhMjljODc0ZGRiYjUxZWU4ZTcwNTc5N2EyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZDNlY2U3MGVhNTg0YWNkYWNmZmFkZTQyNjhmZmQ5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NzIzOTcsOC41MDI5OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjMTgxMzIyOWM2YTRhOWRhYjI0YjE3ZTA4NWVhZWEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5ZTZmMjJjZmNmYjQwNDdiZTU0MWEyMzVjYTFhMmE1ID0gJCgnPGRpdiBpZD0iaHRtbF81OWU2ZjIyY2ZjZmI0MDQ3YmU1NDFhMjM1Y2ExYTJhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Y2hyaXN0b3BoZXI4NkBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjMTgxMzIyOWM2YTRhOWRhYjI0YjE3ZTA4NWVhZWEyLnNldENvbnRlbnQoaHRtbF81OWU2ZjIyY2ZjZmI0MDQ3YmU1NDFhMjM1Y2ExYTJhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZDNlY2U3MGVhNTg0YWNkYWNmZmFkZTQyNjhmZmQ5Ni5iaW5kUG9wdXAocG9wdXBfNmMxODEzMjI5YzZhNGE5ZGFiMjRiMTdlMDg1ZWFlYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWJkMTA3YmQzYWIwNGJjODg4MDQwNTI5ZjVlZDMyNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTMwNDg2NSw4LjQ3ODAyNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTAyNzFiZDIxZDBjNDUyOWIzMmM3MGU0MTY0ZWI1NmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTI2Mjc5OTVkN2MzNDNlODg1YjBhOWY3Y2ZjZTE3NjggPSAkKCc8ZGl2IGlkPSJodG1sXzEyNjI3OTk1ZDdjMzQzZTg4NWIwYTlmN2NmY2UxNzY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yb3NhLW1hcmlhc2NobWlkdEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwMjcxYmQyMWQwYzQ1MjliMzJjNzBlNDE2NGViNTZmLnNldENvbnRlbnQoaHRtbF8xMjYyNzk5NWQ3YzM0M2U4ODViMGE5ZjdjZmNlMTc2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYmQxMDdiZDNhYjA0YmM4ODgwNDA1MjlmNWVkMzI3NS5iaW5kUG9wdXAocG9wdXBfNTAyNzFiZDIxZDBjNDUyOWIzMmM3MGU0MTY0ZWI1NmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2MwY2ExOGJiNDdmNDdjOGJkYzEwMTVlN2NmNzgyMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTUwOTIzNSw4LjQ3ODY5NzY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjNGUzZjg5MDBlMjRjOWE5MTkyZWUzOTUwN2VhMWYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkyMWY3MDdlZDk0NjQ0YjQ5MzZjMGI3MzcwMjU2Y2Q5ID0gJCgnPGRpdiBpZD0iaHRtbF85MjFmNzA3ZWQ5NDY0NGI0OTM2YzBiNzM3MDI1NmNkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aG9yc3RicnVkZXJAaGFtYW5uLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YzRlM2Y4OTAwZTI0YzlhOTE5MmVlMzk1MDdlYTFmMi5zZXRDb250ZW50KGh0bWxfOTIxZjcwN2VkOTQ2NDRiNDkzNmMwYjczNzAyNTZjZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2MwY2ExOGJiNDdmNDdjOGJkYzEwMTVlN2NmNzgyMDAuYmluZFBvcHVwKHBvcHVwXzZjNGUzZjg5MDBlMjRjOWE5MTkyZWUzOTUwN2VhMWYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3Y2U5OTZmYzZhZDQwNDE4ZTc1MDIxZTMzZmVlNDAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2MjM2MSw4LjQ5NTAxNjI0OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZmEzMWI4Y2YxMWU0NTk5YTU5MDEwZGU5ZDJlNzY1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMjZjY2YyOWE3NTM0MDg4ODFmYTIyZjAzNzNmYWFiMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjI2Y2NmMjlhNzUzNDA4ODgxZmEyMmYwMzczZmFhYjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJvZXJyaWNodG1hcmlhQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWZhMzFiOGNmMTFlNDU5OWE1OTAxMGRlOWQyZTc2NTMuc2V0Q29udGVudChodG1sX2IyNmNjZjI5YTc1MzQwODg4MWZhMjJmMDM3M2ZhYWIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y3Y2U5OTZmYzZhZDQwNDE4ZTc1MDIxZTMzZmVlNDAzLmJpbmRQb3B1cChwb3B1cF9lZmEzMWI4Y2YxMWU0NTk5YTU5MDEwZGU5ZDJlNzY1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMDQ1ODEzMjUwOGI0ZmRkODg1YjFlYWJiYmE2NmZhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODY4NzQsOC41MDI5NzA0NDE5NTE2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWVkNDcwYjlmNzQzNDE0N2EyOTc2MzE2NjQ0MDkzNTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQ1Y2U1YTA0M2IxNDA4ZGJlZTljZWRlNjI1NmI0NTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0NWNlNWEwNDNiMTQwOGRiZWU5Y2VkZTYyNTZiNDU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5saXNlbG90dGUyOUByaXR0ZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZWQ0NzBiOWY3NDM0MTQ3YTI5NzYzMTY2NDQwOTM1MC5zZXRDb250ZW50KGh0bWxfZDQ1Y2U1YTA0M2IxNDA4ZGJlZTljZWRlNjI1NmI0NTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzA0NTgxMzI1MDhiNGZkZDg4NWIxZWFiYmJhNjZmYWUuYmluZFBvcHVwKHBvcHVwXzllZDQ3MGI5Zjc0MzQxNDdhMjk3NjMxNjY0NDA5MzUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2MjYyMmZlYWI3ZTQ4Yzc5ZjE4NmVlZTM1YjFiOWIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMDAyNCw4LjUwODE2MTkyMzg4NDQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOGU2YjA2NzU3NDQ0MzZjYjlmNzY3NmU1OGY4M2JjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YzAwNmEwZDMwNzc0OGVjYjVkMmU4OGQ2NTY2NGQwOCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGMwMDZhMGQzMDc3NDhlY2I1ZDJlODhkNjU2NjRkMDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJ1cmNraGFyZHBsYXRoQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4ZTZiMDY3NTc0NDQzNmNiOWY3Njc2ZTU4ZjgzYmM5LnNldENvbnRlbnQoaHRtbF84YzAwNmEwZDMwNzc0OGVjYjVkMmU4OGQ2NTY2NGQwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjI2MjJmZWFiN2U0OGM3OWYxODZlZWUzNWIxYjliMC5iaW5kUG9wdXAocG9wdXBfMzhlNmIwNjc1NzQ0NDM2Y2I5Zjc2NzZlNThmODNiYzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjllZGMzMmRmMzc5NDg1ZWE2OTQ5ZjFlYjAyYTAxM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTIyMTc0LDguNDgxNzE0NDkxMDE4Nzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzZGY4MTg1ZmQ4MjQxYTFhNjVlNjMyY2YzYWZhZmE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhNzZlNjRjZjkzNTQyYWU5OGEyOWZjNzUwNWM1NTEzID0gJCgnPGRpdiBpZD0iaHRtbF82YTc2ZTY0Y2Y5MzU0MmFlOThhMjlmYzc1MDVjNTUxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a2xlbWVuczEwQG1hbmdvbGQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzZGY4MTg1ZmQ4MjQxYTFhNjVlNjMyY2YzYWZhZmE0LnNldENvbnRlbnQoaHRtbF82YTc2ZTY0Y2Y5MzU0MmFlOThhMjlmYzc1MDVjNTUxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yOWVkYzMyZGYzNzk0ODVlYTY5NDlmMWViMDJhMDEzYi5iaW5kUG9wdXAocG9wdXBfYTNkZjgxODVmZDgyNDFhMWE2NWU2MzJjZjNhZmFmYTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjExOWZhZDkzYTQ4NDk5OWFmMjY4NmRhZDFiMWMzYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDg0NjYsOC40ODQzNzE4OTgwMjAyMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2FhOTUzMjQzZWNkNDYwZmE4NTcxNTNhYThlOTZiNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBmYzdjMDM3MjVhNDQ4NmJmMGYyMTBhOTgxYjdjNzQgPSAkKCc8ZGl2IGlkPSJodG1sX2YwZmM3YzAzNzI1YTQ0ODZiZjBmMjEwYTk4MWI3Yzc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hZGVsYmVydHNvbnRhZ0B0YWVzY2hlLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2FhOTUzMjQzZWNkNDYwZmE4NTcxNTNhYThlOTZiNmQuc2V0Q29udGVudChodG1sX2YwZmM3YzAzNzI1YTQ0ODZiZjBmMjEwYTk4MWI3Yzc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxMTlmYWQ5M2E0ODQ5OTlhZjI2ODZkYWQxYjFjM2I2LmJpbmRQb3B1cChwb3B1cF8zYWE5NTMyNDNlY2Q0NjBmYTg1NzE1M2FhOGU5NmI2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNmJhZmEzODM3ZGM0MTlmYjFjZTMzYzJhNGQ2YmUyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODc0ODQ5OTk5OTk5Niw4LjUxMDAyMzA3NTcyMjc4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZGY0OWRmMzdmOGE0NWI4YTA0NDJlYjFhZjU3YWRlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOGNiZDQ3MDE1ZjU0NzE3OGE2ZWJjYTI0MTg1NDE3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDhjYmQ0NzAxNWY1NDcxNzhhNmViY2EyNDE4NTQxNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJvZG8xNEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2RmNDlkZjM3ZjhhNDViOGEwNDQyZWIxYWY1N2FkZTcuc2V0Q29udGVudChodG1sX2Q4Y2JkNDcwMTVmNTQ3MTc4YTZlYmNhMjQxODU0MTcyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2YmFmYTM4MzdkYzQxOWZiMWNlMzNjMmE0ZDZiZTJkLmJpbmRQb3B1cChwb3B1cF8zZGY0OWRmMzdmOGE0NWI4YTA0NDJlYjFhZjU3YWRlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNzgyMzU5Mzg2Njc0N2YxYjhlODc2Zjc4N2IxMDNlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTMxNDM1LDguNDkyMTA0NDE5NTM1NDgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FiYTk0ODE3ZmIzOTQwMDE5ODY2NmQ2MmZiZWExZjljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE2YTExZThjOWYyZDRlNDQ5Njg5YjFhOGE3YzkxNWQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8xNmExMWU4YzlmMmQ0ZTQ0OTY4OWIxYThhN2M5MTVkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2NobWlkdGdpbm9Acm9lbWVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYmE5NDgxN2ZiMzk0MDAxOTg2NjZkNjJmYmVhMWY5Yy5zZXRDb250ZW50KGh0bWxfMTZhMTFlOGM5ZjJkNGU0NDk2ODliMWE4YTdjOTE1ZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjc4MjM1OTM4NjY3NDdmMWI4ZTg3NmY3ODdiMTAzZWEuYmluZFBvcHVwKHBvcHVwX2FiYTk0ODE3ZmIzOTQwMDE5ODY2NmQ2MmZiZWExZjljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhYWVkYzc4MzRkZjQ0MWQ4YTYzYmY1NDg5OTRmODc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNDkxNCw4LjQ4NTM3OTE1NDIyMjI2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYmUyMzNmYjgzODc0YzliYjEzMzRjMWNiNWQ1MThlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MWQzZDY3M2ZhNzE0NjgxYjI4N2NmMmIxMWU2ZDY3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDFkM2Q2NzNmYTcxNDY4MWIyODdjZjJiMTFlNmQ2NzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmlzYWJlbGxqdW5rQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JlMjMzZmI4Mzg3NGM5YmIxMzM0YzFjYjVkNTE4ZTYuc2V0Q29udGVudChodG1sXzQxZDNkNjczZmE3MTQ2ODFiMjg3Y2YyYjExZTZkNjc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhYWVkYzc4MzRkZjQ0MWQ4YTYzYmY1NDg5OTRmODc3LmJpbmRQb3B1cChwb3B1cF9jYmUyMzNmYjgzODc0YzliYjEzMzRjMWNiNWQ1MThlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZjFhN2ZhZDNjNmU0MDE3YmNkMzEzNDU0OWVjNjE4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzA1ODYsOC41MDE5MjEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyY2JiNTE4YjMyYTRlY2FhOWM1MTBlZDBkYmEzYzgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhYmRkNTVmMDNlYzQ2ZDA5MGEwOGRiZDhkN2E4MTZlID0gJCgnPGRpdiBpZD0iaHRtbF9kYWJkZDU1ZjAzZWM0NmQwOTBhMDhkYmQ4ZDdhODE2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2VpdHplbGRhbmllbGFAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDJjYmI1MThiMzJhNGVjYWE5YzUxMGVkMGRiYTNjODAuc2V0Q29udGVudChodG1sX2RhYmRkNTVmMDNlYzQ2ZDA5MGEwOGRiZDhkN2E4MTZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmMWE3ZmFkM2M2ZTQwMTdiY2QzMTM0NTQ5ZWM2MTg2LmJpbmRQb3B1cChwb3B1cF8wMmNiYjUxOGIzMmE0ZWNhYTljNTEwZWQwZGJhM2M4MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YjVmNDhhNmVhYzA0ODBiODdlOGM0MDA3MzQ0ZDI1OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjE3MTcxNTQ3NzQ4Niw4LjQ5NTk5NzI0NjY0ODMxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjliZGFjZGQzMzA1NDRmYzg0Nzg4YWY0NTdkOTNkYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDIzZmMwZWZiOWJhNGMyMmJjNjZkNGEzMjllZDhkZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzQyM2ZjMGVmYjliYTRjMjJiYzY2ZDRhMzI5ZWQ4ZGVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZWJhYi1IYXVzIEjDtm5nZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjliZGFjZGQzMzA1NDRmYzg0Nzg4YWY0NTdkOTNkYTIuc2V0Q29udGVudChodG1sXzQyM2ZjMGVmYjliYTRjMjJiYzY2ZDRhMzI5ZWQ4ZGVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliNWY0OGE2ZWFjMDQ4MGI4N2U4YzQwMDczNDRkMjU5LmJpbmRQb3B1cChwb3B1cF9iOWJkYWNkZDMzMDU0NGZjODQ3ODhhZjQ1N2Q5M2RhMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjgxYjA4NDU0MjM0YTVjYjI3Yzk2OGYzOThhMWQ2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjA4Mjg5MzY4OTI3Niw4LjQ5NjkwMzQxNjkwMDU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODUyYTdhMDAwMzdmNGQwMDg5OWJjMzY2YmE3NjRkZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTliNGY3Zjk2MjJkNGJlN2JhMTA3ODRkZDg5Y2Y1NjQgPSAkKCc8ZGl2IGlkPSJodG1sXzE5YjRmN2Y5NjIyZDRiZTdiYTEwNzg0ZGQ4OWNmNTY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZXNwZXJhZG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1MmE3YTAwMDM3ZjRkMDA4OTliYzM2NmJhNzY0ZGQyLnNldENvbnRlbnQoaHRtbF8xOWI0ZjdmOTYyMmQ0YmU3YmExMDc4NGRkODljZjU2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjgxYjA4NDU0MjM0YTVjYjI3Yzk2OGYzOThhMWQ2MC5iaW5kUG9wdXAocG9wdXBfODUyYTdhMDAwMzdmNGQwMDg5OWJjMzY2YmE3NjRkZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2M5MmU2Yjg1OTg2NDQ4NzhjMmVhMzI5MjgwNGRjNmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM5MzUzNTg5Nzc0NCw4LjQ5NjUyNDE3NDc1MDgwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTFkYzk5Zjc3MGU5NGMyM2EyMzI2YTlmZGJkYWNjYmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmMyZWY3NDliMTc2NDg4NWJmZjdiMDc5N2NiYjg1MDIgPSAkKCc8ZGl2IGlkPSJodG1sX2JjMmVmNzQ5YjE3NjQ4ODViZmY3YjA3OTdjYmI4NTAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BcmdlbnRpbmEgU3RlYWtob3VzZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTFkYzk5Zjc3MGU5NGMyM2EyMzI2YTlmZGJkYWNjYmIuc2V0Q29udGVudChodG1sX2JjMmVmNzQ5YjE3NjQ4ODViZmY3YjA3OTdjYmI4NTAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjOTJlNmI4NTk4NjQ0ODc4YzJlYTMyOTI4MDRkYzZlLmJpbmRQb3B1cChwb3B1cF81MWRjOTlmNzcwZTk0YzIzYTIzMjZhOWZkYmRhY2NiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYmJmOGQ5NWViZTg0NzM4YjgwMTZhNjhlMWE2MjZlZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjI2NDM3ODQxNzQ1LDguNDk1NTU3NjA5NTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGE3MGE0ZWQyNmUwNDI2Zjk0YzY1NjY1ODNkMmU0MTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGUwYTYxMWQ5NzhlNDQ1MGFkZjhjMjdlODJmZDc0NmYgPSAkKCc8ZGl2IGlkPSJodG1sXzBlMGE2MTFkOTc4ZTQ0NTBhZGY4YzI3ZTgyZmQ3NDZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Pc3RlcmlhIGRhIEJpYWdpbzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGE3MGE0ZWQyNmUwNDI2Zjk0YzY1NjY1ODNkMmU0MTguc2V0Q29udGVudChodG1sXzBlMGE2MTFkOTc4ZTQ0NTBhZGY4YzI3ZTgyZmQ3NDZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiYmY4ZDk1ZWJlODQ3MzhiODAxNmE2OGUxYTYyNmVkLmJpbmRQb3B1cChwb3B1cF9kYTcwYTRlZDI2ZTA0MjZmOTRjNjU2NjU4M2QyZTQxOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTEyZDRhNmQ2OWU0N2M3YTgyZGRhZmEwZTI2Mzc3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTY3MjIzMTg4NDg3NCw4LjQ5OTEyMTMwMTU4OTg5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM0MDc1MTZjMjJhNDgzYjkyM2YwNzliYzc0ZDBkYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGY0ZDAzMjAzNjEyNDEzYWE2NGVmNDQ0NDhmMmIzZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzhmNGQwMzIwMzYxMjQxM2FhNjRlZjQ0NDQ4ZjJiM2Y1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6ZXJpYSBSYXBpZG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzNDA3NTE2YzIyYTQ4M2I5MjNmMDc5YmM3NGQwZGMyLnNldENvbnRlbnQoaHRtbF84ZjRkMDMyMDM2MTI0MTNhYTY0ZWY0NDQ0OGYyYjNmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMTEyZDRhNmQ2OWU0N2M3YTgyZGRhZmEwZTI2Mzc3NC5iaW5kUG9wdXAocG9wdXBfMDM0MDc1MTZjMjJhNDgzYjkyM2YwNzliYzc0ZDBkYzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmM4ZWRlN2IyZDY0NGE2MmI5NDdmMTAxODJkMDRmMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMwMDA4NDQ5Njk0MSw4LjQ5ODIwNjAxMTMwMDI2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODAxY2Y5NDEwYjc4NDIxNDlmNTBmMTA4NzY0NzcwZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FmOTNkM2M2NDU1NDM1ODgyM2U5MDY3MTkyODZkNzEgPSAkKCc8ZGl2IGlkPSJodG1sXzNhZjkzZDNjNjQ1NTQzNTg4MjNlOTA2NzE5Mjg2ZDcxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJjZWxsbyYjMzk7cyBCaXN0cm88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwMWNmOTQxMGI3ODQyMTQ5ZjUwZjEwODc2NDc3MGUwLnNldENvbnRlbnQoaHRtbF8zYWY5M2QzYzY0NTU0MzU4ODIzZTkwNjcxOTI4NmQ3MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YzhlZGU3YjJkNjQ0YTYyYjk0N2YxMDE4MmQwNGYyYi5iaW5kUG9wdXAocG9wdXBfODAxY2Y5NDEwYjc4NDIxNDlmNTBmMTA4NzY0NzcwZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDQ2Y2UwNWExODAzNGQyZGE5ODQ0MjJkZDFkMTZlZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTUzNzM5OTc1MjE3OCw4LjUwNTc3NDEyMTMxOTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOTFmODE2Njc1OTA0OTA4OTgwNGE3NjJjNTAxNDAzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDA0YjY5OTQwYjM0OTU0OWYxNzBlMTY5NTVkNThmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQwNGI2OTk0MGIzNDk1NDlmMTcwZTE2OTU1ZDU4ZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlc3RhdXJhbnQgVHVyYmluZW5oYXVzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTFmODE2Njc1OTA0OTA4OTgwNGE3NjJjNTAxNDAzZS5zZXRDb250ZW50KGh0bWxfMGQwNGI2OTk0MGIzNDk1NDlmMTcwZTE2OTU1ZDU4ZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDQ2Y2UwNWExODAzNGQyZGE5ODQ0MjJkZDFkMTZlZTEuYmluZFBvcHVwKHBvcHVwXzM5MWY4MTY2NzU5MDQ5MDg5ODA0YTc2MmM1MDE0MDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1NTlmNjVkNDUzOTQ4YzM4MWQ2NjQyNmFiY2E5YTBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMjgxMjEsOC41MDM2ODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmMmM4NmY3Yzg5MTRlODlhNzQ1MzVjMDRmMTczNzU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwNjg1ZWZiOGQ5ODRmMDZiY2U3MzE1NDhkZjgzNzJmID0gJCgnPGRpdiBpZD0iaHRtbF8zMDY4NWVmYjhkOTg0ZjA2YmNlNzMxNTQ4ZGY4MzcyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVsIFNvbGUgUGl6emFrdXJpZXIgSMO2bmdnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjJjODZmN2M4OTE0ZTg5YTc0NTM1YzA0ZjE3Mzc1OC5zZXRDb250ZW50KGh0bWxfMzA2ODVlZmI4ZDk4NGYwNmJjZTczMTU0OGRmODM3MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjU1OWY2NWQ0NTM5NDhjMzgxZDY2NDI2YWJjYTlhMGYuYmluZFBvcHVwKHBvcHVwX2VmMmM4NmY3Yzg5MTRlODlhNzQ1MzVjMDRmMTczNzU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzNDk5ZDE2YzEzNzQwYWI5YjJiMTI1MTU3MWQ3NjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNzc5MDI4NjI0MjgsOC40OTI0OTYwMTM2NDEzNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg1M2NmNGUwZDY5MTRiZmVhYjcyMWE0ZGMzYjNiN2IwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0ZTkwZDA1MGU0YzQwMGI4ODAzMWQ5ZWUxM2U2NmUxID0gJCgnPGRpdiBpZD0iaHRtbF84NGU5MGQwNTBlNGM0MDBiODgwMzFkOWVlMTNlNjZlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFoYXJhbmk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1M2NmNGUwZDY5MTRiZmVhYjcyMWE0ZGMzYjNiN2IwLnNldENvbnRlbnQoaHRtbF84NGU5MGQwNTBlNGM0MDBiODgwMzFkOWVlMTNlNjZlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzQ5OWQxNmMxMzc0MGFiOWIyYjEyNTE1NzFkNzYxYS5iaW5kUG9wdXAocG9wdXBfODUzY2Y0ZTBkNjkxNGJmZWFiNzIxYTRkYzNiM2I3YjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTk1ODM2NzI2OWUyNGRiMWE4NzE2ZGE5MzUyMTczNTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTkzNTI2NDQ2MjA0OSw4LjQ4OTM2MTI5MjQzMzYxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNGJmMWViODUzNjBjNDBkYmJiYjU3NmQxMmNiZGU2NjkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmMxMWQzNjU5Mjc2NDU3NDhiNTRhY2JiZTA2OTA5NTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWIwYThkOWQ2ZjgzNDZiNDg0OTJkYzFmZDc0NzhhOTEgPSAkKCc8ZGl2IGlkPSJodG1sX2ViMGE4ZDlkNmY4MzQ2YjQ4NDkyZGMxZmQ3NDc4YTkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZXN0YXVyYW50IFdlcmRpbnNlbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmMxMWQzNjU5Mjc2NDU3NDhiNTRhY2JiZTA2OTA5NTMuc2V0Q29udGVudChodG1sX2ViMGE4ZDlkNmY4MzQ2YjQ4NDkyZGMxZmQ3NDc4YTkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5NTgzNjcyNjllMjRkYjFhODcxNmRhOTM1MjE3MzUwLmJpbmRQb3B1cChwb3B1cF9mYzExZDM2NTkyNzY0NTc0OGI1NGFjYmJlMDY5MDk1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWU4NWY5NTg1MTc0MjVmYWZjNzM4MTQ1N2Q2NWM2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwODAxNDI1MzUxOTUxLDguNTA3NjgxMzI3NDkyNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF80YmYxZWI4NTM2MGM0MGRiYmJiNTc2ZDEyY2JkZTY2OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NmI0OGFiMjY1Njk0NWYyYjk0MTVmYmIyOGQ3YmE4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzJjOTJjOWEyN2M0YWExODg3ZmFmYWRmMmVlOTJiYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmMyYzkyYzlhMjdjNGFhMTg4N2ZhZmFkZjJlZTkyYmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVUSCBDaGVtaWVjYWZldGVyaWE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ2YjQ4YWIyNjU2OTQ1ZjJiOTQxNWZiYjI4ZDdiYTg5LnNldENvbnRlbnQoaHRtbF82YzJjOTJjOWEyN2M0YWExODg3ZmFmYWRmMmVlOTJiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NWU4NWY5NTg1MTc0MjVmYWZjNzM4MTQ1N2Q2NWM2My5iaW5kUG9wdXAocG9wdXBfNDZiNDhhYjI2NTY5NDVmMmI5NDE1ZmJiMjhkN2JhODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDY3Y2UyZWQwMzg2NDllZmFhYjQ0MGQyMDkxZTA4MjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDgzMTE1MDE2NDQ3MSw4LjUwNzYyNzI3NjM0ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzRiZjFlYjg1MzYwYzQwZGJiYmI1NzZkMTJjYmRlNjY5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3YTYyYjI2YWQ0ZDRiZGViNzYzMzE4NjhkNGUwMDlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhOTJjYjI5NjJhZjQwOTBiZTI3MzhhYTJhN2UxYzkzID0gJCgnPGRpdiBpZD0iaHRtbF9hYTkyY2IyOTYyYWY0MDkwYmUyNzM4YWEyYTdlMWM5MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1YgQmlzdHJvIEjDtm5nZ2VyYmVyZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTdhNjJiMjZhZDRkNGJkZWI3NjMzMTg2OGQ0ZTAwOWEuc2V0Q29udGVudChodG1sX2FhOTJjYjI5NjJhZjQwOTBiZTI3MzhhYTJhN2UxYzkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2N2NlMmVkMDM4NjQ5ZWZhYWI0NDBkMjA5MWUwODIwLmJpbmRQb3B1cChwb3B1cF9hN2E2MmIyNmFkNGQ0YmRlYjc2MzMxODY4ZDRlMDA5YSk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ 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 0x1a25343190>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(createRawMap(custLatitude, custLongitude, custAddr, helperData, venues))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Nice.\n", "\n", "Customer = red circle\n", "\n", "Helpers = blue dots\n", "\n", "Shops = green dots\n", "\n", "As a human it would be quite obvious now to tell the customer to order at Marcello's Bistro or Pizzerie Rapodio.\n", "There are also quite a few ideal helpers because they live both near to the bistro and the customer.\n", "\n", "However, our customer may not like the food Marcello's Bistro produces etc., choices may not be that obvious or there simply could be too many reqeusts for a person to process by phone.\n", "\n", "__We would like to automate such decisions and ideally introduce various parameters in the process.__\n", "\n", "So now here our recommender system comes into place." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### recommender system - what measurements do we use to get to our recommendations?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "what we want to minimize:\n", "- total distance helper has to travel\n", "\n", "assumptions:\n", "- distances measured in air-line distance (may in some cases where street topology is special not lead to the ultimate best decisions, e.g. elevation ignored or dead end streets)\n", "\n", "variables to measure distances the helper has to travel:\n", "1. __HtoS__ = distance from the helper (H) to the shop (S)\n", "2. __StoC__ = distance from shop (S) to customer (C)\n", "3. __CtoH__ = distance from customer (C) to shop (S)\n", "\n", "for the travel time of our helper to be minimized we basically need to **minimze the sum of our variables 1 to 3** (HtoS+StoC+CtoH = __totDis__)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# initialize variables\n", "numH = helperData.shape[0] # number of helpers\n", "numS = venues.shape[0] # number of shops\n", "numC = 1 # test with only 1 customer\n", "HtoS = np.zeros([numS, numH]) # 2-dim matrix, helpers in columns, shops in rows\n", "StoC = np.zeros([numS,1]) # 1-dim matrix, shops in rows\n", "CtoH = np.zeros([1, numH]) # 1-dim matrix, helpers in columns\n", "totDist = np.zeros([numS, numH]) #2-dim matrix, helpers in columns, shops in rows" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# calculate distances from all helpers to all shops (in meters rounded to whole numbers)\n", "for hId, helper in helperData.iterrows():\n", " for sId, shop in venues.iterrows():\n", " tmpCord1 = (helper['latitude'], helper['longitude'])\n", " tmpCord2 = (shop['Venue Latitude'], shop['Venue Longitude'])\n", " HtoS[sId][hId]=round(geopy.distance.distance(tmpCord1, tmpCord2).m,0)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "# calculate distances from all shops to our customer (in meters rounded to whole numbers)\n", "tmpCord1 = (custLatitude, custLongitude)\n", "for sId, shop in venues.iterrows():\n", " tmpCord2 = (shop['Venue Latitude'], shop['Venue Longitude'])\n", " StoC[sId][0]=round(geopy.distance.distance(tmpCord1, tmpCord2).m,0)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# calculate distances from our customer to all helpers (in meters rounded to whole numbers)\n", "tmpCord2 = (custLatitude, custLongitude)\n", "for hId, helper in helperData.iterrows():\n", " tmpCord1 = (helper['latitude'], helper['longitude'])\n", " CtoH[0][hId]=round(geopy.distance.distance(tmpCord1, tmpCord2).m,0) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### descriptive statistics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we do some quick and dirty **heatmaps and descriptive statistics to get a feel for distribution of the distances** we have calculated here." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "# define custom color map ranging from green to white to red \n", "greenToRed=LinearSegmentedColormap.from_list('gr',[\"g\", \"w\",\"w\",\"w\",\"w\",\"w\", \"r\"], N=128)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The color range from green to red is **separated by 5 segments of white to get a better feel for the extreme values**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### HtoS – distances between helpers and shops" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DescribeResult(nobs=1560, minmax=(66.0, 2997.0), mean=1020.1467948717949, variance=347633.2350121708, skewness=0.6149120572489256, kurtosis=-0.05753935414874878)\n" ] } ], "source": [ " print(stats.describe(HtoS, axis=None))" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set font size of plot labels to 24 pt\n", "font = {'size' : 24}\n", "plt.rc('font', **font)\n", "\n", "# Heatmap of distances from all helpers to all shops (green = closer, red = further away)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(HtoS, cmap=greenToRed)\n", "plt.title(\"distances - HtoS\")\n", "plt.xlabel('helpers')\n", "plt.ylabel('shops')\n", "plt.show())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The closest shop to a helper is only 66 meters away, mean distance is about 1 km and variance is obviously very high.\n", "\n", "The shop with indice 6 seems to be the one that is furthest away from some of the helpers. If you have a look a the venues datafram, you see, that this is \"Restaurant Turbinenhaus\". If you look on the map, you can see it's located at the bottom right of the map and therefore naturally far away from helpers on the top left." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### StoC – distances between shops and customers" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DescribeResult(nobs=12, minmax=(105.0, 957.0), mean=482.5833333333333, variance=99210.08333333334, skewness=0.3728582113979914, kurtosis=-1.475914078451692)\n" ] } ], "source": [ "print(stats.describe(StoC,axis=None))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of distances from all shops to our customer (green = closer, red = further away)\n", "plt.imshow(StoC.transpose(), cmap=greenToRed) # transposed to use less space\n", "#ax1 = plt.axes(frameon=False)\n", "plt.title(\"distances - StoC\")\n", "plt.xlabel('shops')\n", "plt.tick_params(\n", " axis='y', # changes apply to the x-axis\n", " which='both', # both major and minor ticks are affected\n", " left=False, # ticks along the bottom edge are off\n", " top=False, # ticks along the top edge are off\n", " labelleft=False) # labels along the bottom edge are off\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We get a good picture about possible shop recommendations here. The shop with indice 6 also seems to be far away from our customer. It probably won't make it into our recommendation list, then.\n", "\n", "**Shops 5,4 and 1 could be potentially interesting when the shop has to be close.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### CtoH – distances between our customer and our helpers" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DescribeResult(nobs=130, minmax=(105.0, 2080.0), mean=876.6769230769231, variance=306164.14287418005, skewness=0.6655659563462873, kurtosis=-0.6208715228192303)\n" ] } ], "source": [ "print(stats.describe(CtoH,axis=None))" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of distances from our customer to all helpers (green = closer, red = further away)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(CtoH, cmap=greenToRed)\n", "plt.title(\"distances - CtoH\")\n", "plt.xlabel('helpers')\n", "plt.tick_params(\n", " axis='y', # changes apply to the x-axis\n", " which='both', # both major and minor ticks are affected\n", " left=False, # ticks along the bottom edge are off\n", " top=False, # ticks along the top edge are off\n", " labelleft=False) # labels along the bottom edge are offplt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are quite a few helpers located close to our customer, which is promising." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### totDist – total distance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Having our 3 matrices in place it is actually really simple now to **calculate our total distance:**" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "# calculate total distance\n", "totDist=HtoS+StoC+CtoH" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we do simple descriptive statistics and a quick heatmap:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DescribeResult(nobs=1560, minmax=(281.0, 6034.0), mean=2379.4070512820513, variance=1379222.639206181, skewness=0.5854207297337536, kurtosis=-0.2367640214900928)\n" ] } ], "source": [ "print(stats.describe(totDist,axis=None))" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of total distances for all shop and helper combinations (green = closer, red = further away)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(HtoS, cmap=greenToRed)\n", "plt.title(\"distances - totDist (total distance)\")\n", "plt.xlabel('helpers')\n", "plt.ylabel('shops')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we can clearly see that \"Restaurant Turbinenhaus\" with index 6 will not be a good recommendation. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### weighting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have 4 different distance measures with totDist clearly being the most important one.\n", "\n", "**BUT: Let's consider the case, where the customer orders refrigerated or especially heavy goods.**\n", "\n", "As a customer you don't want to receive your refrigerated goods thawed.\n", "\n", "As a helper you don't want to lift heavy goods for a long time and over a long distance.\n", "\n", "**So total distance won't be the most important measure anymore.** For both cases it would then make sense to **minimize the distance between the shop and the customer**. Even if this means to have a larger total distance than any other helper shop combinations. \n", "\n", "Additionally, refrigerate goods thaw more quickly, the hotter it is. So the local weather needs to be addressed as well." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### calculation of the weights" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Warning: Tuning of the following parameters is based on (somewhat educated) guesses, not sound science." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "# function that returns a weight matrix depending on the weather, items purchased and equipment of the helper\n", "def returnWeights (temperature, isRefrigerated=False, isHeavy=False):\n", " \n", " # array structure \n", " # for weights[HtoS, StoC, StoC_T, CtoH, totDist] -> \"_T\" means that the helper has a trolley\n", " w_standard = np.array([0, 0, 0, 0, 10]) # total distance gets optimized, rest omitted\n", " \n", " if temperature>30: # StoC gets weighted more the hotter it is (if we have refrigerated items),\n", " # for the helper having a trolley (with a thermos bag) helps to keep the goods cold\n", " w_refrigerated = np.array([0, 20, 10, 0, 0])\n", " elif temperature>25:\n", " w_refrigerated = np.array([0, 10, 5, 0, 0])\n", " elif temperature>15:\n", " w_refrigerated = np.array([0, 4, 2, 0, 0])\n", " else:\n", " w_refrigerated = np.array([0, 2, 1, 0, 0])\n", "\n", " # StoC gets weighted more for heavy items (3) and even more so if the helper has no trolley (8)\n", " w_heavy = np.array([0, 20, 10, 0, 0])\n", " \n", " # calculate total weight by adding the subweights\n", " w_total = w_standard + isRefrigerated*w_refrigerated + isHeavy*w_heavy\n", "\n", " # calculate and return normalized weight matrix where all weights sum up to 1\n", " w_total = w_total / w_total.sum()\n", " return w_total" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We somehow need to get hold of *daily temperature* data that can be used to call our returnWeights function.\n", "\n", "For the current purpose we can use the free **openweathermap.org API**.\n", "\n", "We simply repeat the same process as for the Foursquare API:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "# read Openweathermap.org API credentials like in the example of the foursquare API further above\n", "cred_weather=pd.read_json(r'cred_openweathermap.json')\n", "\n", "OWM_VERSION=cred_weather['keys'][0]['scriptvalue'] # Openweathermap API version\n", "OWM_APIKEY=cred_weather['keys'][1]['scriptvalue'] # Openweathermap API key" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "def getWeatherData (lat, lon, APIKEY, VERSION):\n", " # create the API request URL\n", " url = 'https://api.openweathermap.org/data/{}/weather?lat={}&lon={}&appid={}&units=metric'.format(\n", " VERSION, \n", " lat, \n", " lon, \n", " APIKEY)\n", "\n", " # make the GET request\n", " results = requests.get(url).json()\n", " \n", " return results" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'coord': {'lon': 8.5, 'lat': 47.4},\n", " 'weather': [{'id': 500,\n", " 'main': 'Rain',\n", " 'description': 'light rain',\n", " 'icon': '10d'}],\n", " 'base': 'stations',\n", " 'main': {'temp': 19.93,\n", " 'feels_like': 16.91,\n", " 'temp_min': 18.33,\n", " 'temp_max': 21,\n", " 'pressure': 1008,\n", " 'humidity': 32},\n", " 'visibility': 10000,\n", " 'wind': {'speed': 2.1, 'deg': 40},\n", " 'rain': {'3h': 0.33},\n", " 'clouds': {'all': 95},\n", " 'dt': 1587910061,\n", " 'sys': {'type': 1,\n", " 'id': 6941,\n", " 'country': 'CH',\n", " 'sunrise': 1587874624,\n", " 'sunset': 1587925808},\n", " 'timezone': 7200,\n", " 'id': 2658017,\n", " 'name': 'Werdhölzli',\n", " 'cod': 200}" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# call function to get current weather of our customer location\n", "weather = getWeatherData(custLatitude, custLongitude, OWM_APIKEY, OWM_VERSION)\n", "weather" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This works fine, the selected weather station 'Werdhölzli' makes sense and data seems to be reasonable for today.\n", "\n", "Let's extract the current temperature at our customer location." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "19.93 °C\n" ] } ], "source": [ "# extract max temperature\n", "temp = weather['main']['temp']\n", "print(temp,'°C')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's create a few test cases, where we play around with the parameters and have a look at the changes it produces on the weight matrix." ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Now we have a look at what weights are applied when we alter our variables\n", "\n", "First we're getting the current temperature:\n", "temperature at customer location: 19.93 °C\n", "\n", "[HtoS StoC StoC_T CtoH totDis]\n", "[0.000 0.000 0.000 0.000 1.000] -> standard case\n", "[0.000 0.500 0.250 0.000 0.250] -> heavy items\n", "[0.000 0.250 0.125 0.000 0.625] -> refrigerated items with today's weather\n", "[0.000 0.571 0.286 0.000 0.143] -> heavy and refrigerated item on a hot summer day\n" ] } ], "source": [ "print('Now we have a look at what weights are applied when we alter our variables\\n')\n", "\n", "print('First we\\'re getting the current temperature:')\n", "temp=getWeatherData(custLatitude, custLongitude, OWM_APIKEY, OWM_VERSION)['main']['temp']\n", "print('temperature at customer location:',temp,'°C\\n')\n", "\n", "np.set_printoptions(formatter={'float': lambda x: \"{0:0.3f}\".format(x)}) # print floats to only 3 digits precision\n", "\n", "print('[HtoS StoC StoC_T CtoH totDis]')\n", "standard_weights = returnWeights (temp, isRefrigerated=False, isHeavy=False)\n", "print(standard_weights,'-> standard case')\n", "\n", "heavy_weights = returnWeights (temp, isRefrigerated=False, isHeavy=True)\n", "print(heavy_weights,'-> heavy items')\n", "\n", "frigo_weights = returnWeights (temp, isRefrigerated=True, isHeavy=False)\n", "print(frigo_weights,'-> refrigerated items with today\\'s weather')\n", "\n", "hot_heavy_frigo_weights = returnWeights (temperature=35, isRefrigerated=True, isHeavy=True)\n", "print(hot_heavy_frigo_weights,'-> heavy and refrigerated item on a hot summer day')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So in this setting **total distance gets less weight and the distance from the shop to the customer gets more weight under certain conditions**. Just like we wanted to." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's also obvious that HtoS and CtoH have no relevance at all in our current setting. So we might as well leave it out completely. But because future relevant use cases might bring importance to those, we'll keep it for now." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The parameter isRefrigerated depends on the food ordered. The trolly on the other hand is something that is determined by the helper.\n", "\n", "So let's create a **one hot encoded matrix for trolleys** with 1 indicating that the helper has a trolley:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DescribeResult(nobs=130, minmax=(0, 1), mean=0.23846153846153847, variance=0.18300536672629697, skewness=1.2274688184341327, kurtosis=-0.4933202997719137)\n" ] } ], "source": [ "# generate matrix with length corresponding to our number of helpers and about 20% having a trolley\n", "hTrolley=np.random.choice([0, 1], size=helperData.shape[0], p=[.8, .2])\n", "#hTrolley=hTrolley.reshape((-1, 1))\n", "print(stats.describe(hTrolley,axis=None))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we're only missing a reusable **function** that applies all this data and returns a **score matrix**:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "scrolled": true }, "outputs": [], "source": [ "def calcScores(HtoS, StoC, CtoH, totDist, weights, hTrolley):\n", " w_HtoS=weights[0]\n", " w_StoC=weights[1]\n", " w_StoC_T=weights[2]\n", " w_CtoH=weights[3]\n", " w_totDist=weights[4]\n", " \n", " return w_HtoS*HtoS + w_StoC*StoC*hTrolley + w_StoC_T*StoC*abs(hTrolley-1) + w_CtoH*CtoH + w_totDist*totDist" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function norms the score matrix by dividing it by the maximum value. This way we get a range from 0 to 1.\n", "\n", "0 would be the case, where the helper and the customer live at the same address as the shop.\n", "\n", "**So the closer the score to 0, the better:**" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "def normPerfectToZero(array):\n", " return array / array.max()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we should be all set up." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There could be numerous other parameters applied, e.g. shop rating and so an. But for the purpose of this PoC we'll leave it at that and see what our recommender system returns for our customer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### standard case - not refrigerated, not heavy" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "standard_score = normPerfectToZero(calcScores(HtoS, StoC, CtoH, totDist, standard_weights, hTrolley))" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "# set font size of plot labels to 24 pt\n", "font = {'size' : 24}\n", "plt.rc('font', **font)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of total distances for all shop and helper combinations\n", "# (green = lower score = better, red = high score = bad choice)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(standard_score, cmap=greenToRed)\n", "plt.title(\"scores – standard case\")\n", "plt.xlabel('helpers')\n", "plt.ylabel('shops')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DescribeResult(nobs=1560, minmax=(0.04656943984090156, 1.0), mean=0.39433328658966715, variance=0.03788120326673271, skewness=0.5854207297337527, kurtosis=-0.23676402149009323)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.describe(standard_score,axis=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### heavy items" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "heavy_score = normPerfectToZero(calcScores(HtoS, StoC, CtoH, totDist, heavy_weights, hTrolley))" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of total distances for all shop and helper combinations\n", "# (green = lower score = better, red = high score = bad choice)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(heavy_score, cmap=greenToRed)\n", "plt.title(\"scores – heavy items\")\n", "plt.xlabel('helpers')\n", "plt.ylabel('shops')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DescribeResult(nobs=1560, minmax=(0.04902832465388035, 1.0), mean=0.3781364090839513, variance=0.03131248140918763, skewness=0.5316299109179674, kurtosis=-0.04014952503549729)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.describe(heavy_score,axis=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### refrigerated items" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "frigo_score = normPerfectToZero(calcScores(HtoS, StoC, CtoH, totDist, frigo_weights, hTrolley))" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABtoAAAD/CAYAAAB/yQIdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdebgcVZn48e+bjRASwqoBFCODRhCVJSgqiqKowyIqMrj8ZgRRdEYdHNcRdMZ1ZHBcEMcZkc19EBcU0XEBUXEEZQmOIGBAYAxE9pAAgZC8vz+q2jRt3+6uun379u18P89TT9dyTp3TXVWnq+vtUxWZiSRJkiRJkiRJkqRqpk12BSRJkiRJkiRJkqSpyECbJEmSJEmSJEmSVIOBNkmSJEmSJEmSJKkGA22SJEmSJEmSJElSDQbaJEmSJEmSJEmSpBoMtEmSJEmSJEmSJEk1GGiTJEmSpCEVES+LiHMj4vaIWBsRGRE5jvVdX67j/D5WUwMUEe9t7AcRsbDmOg5vWsez+lpBSZIkaQMzY7IrIEmSJEn6cxHxYeAfJ7sekiRJkqSx2aNNkiRJkoZMRDwCeHs5eQ1wKLAb8IRy0ASJiIVNvb3eO9n1mQz2eJMkSZJ6Z482SZIkSRo++wLTy/G3ZebZ/VhpZi7sx3o0tWXm6cDpk1wNSZIkaSTYo02SJEmShs92TeNXT1otJEmSJEkdGWiTJEmSpOGzUdP4A5NWC0mSJElSRwbaJEmSpB5FxFYR8U8R8YuIuD0i1kTEHRFxTUT8KCLeHRFP6rKO7SPiXyLiooi4NSIeiIhl5fTxEfHkDnkjIl4WEWeVee6PiDsj4rKIOC4ithsrb5n/+vKZS+eX0wsj4qMRcWVE3F0ue1GbfLMi4rURcU5LuZdGxIcjYpsu5W4SEW+JiPMj4pbyPa+IiKUR8dOI+GBEPL3TOiZLRJzeeFZVOb1JRLyj3F63lcs+MUbev4yIL0TEtRFxTzlcExEnR8RuY+RplPXPTbN/3/S8rIyIw5vSV9qmrek7vO8nRcTnIuL/yu19U0R8JyIOLJf3/AyviHh8RHwyIv633G/uj4g/RMTXI+JFEREd8p5flnF9Ob1VRLw/Ii4v15UR8eam9NMiYq+I+EBEXNC0v62MiKsj4rSIeGqH8hL4fdOsf2757P9UlzHyV97mbdbxtIg4o/zM7y+3wZkRsU8v+Xsso+32i4hnlZ/BaU3Jf9zmMzh9jPXWbisaZTfv4xGxf7nf3RQR90XEVRHxoYjYrCXvnhHxpYj4fUSsLss+JSIe2eVzmLJtkyRJkoaHz2iTJEmSehARewHnAFu0LNq8HB4DPAd4FvDcMdZxDPBeYGbLom3L4cnA2yNi88y8qyXv1sBZwNNa8s4Cdi2Hv4+IozLziz28n/2BrwCbdkm3K/B1YIc25e5WDm+KiFdl5tfb5H8M8EPgUS2LZpZl/wXwDOBlwI7d6j2ZIuLRwPcptnWndFsA/wXs12bxY8rhyIg4DjgmM7NP9etpm/awnjcAn+Chvxe3AQ4ADoiI/wB+2cN6pgHHA//An//JczvgJeXw/Yg4LDNXdFnfYuBsYEGHZB8Djm4zfybw2HI4PCJOBI7u42ffl20eEe8G3g80Bx8fAbwUOCQi3tOP+k6E8bYVbdb3ceDNLbMXAccAB0fEszPz1og4Gvgo659pCEV7+mrgoIjYOzOvabP+kWmbJEmSNLkMtEmSJEldRMQs4EyKINtait4e5wA3Aw8CD6cIdL0AGOsC+r8Bby0nVwGfpbjIuxzYBNgJeD5wUJu8s8u0jd5yvwI+CVxFcUH4AOCNwMbA5yPi3sz8Roe3tD1FUGAtRc+p84H7gJ2B65vKfQLwM2AusBo4BfhpmWYW8HSKC+ELgDMiYr/M/HFLWV9k/YXsM4GvAX8oy9saeAJFcGJhh/oOi29SBBE+C3wDuIUiCPKnC/wRMZfiM3p8Oes7FO/79xSf4RMottVuwD9SfA7vbyrjCeXr3wF/W44/H7ipKc0f2tStp23aTUQcDHyqnLyfYj/7LsU+uzPF9v7bsv7dnAq8qhy/HDgJ+B1wO8U+8dfAiyne39ci4vmZuW6Mdc2l+PznUwRVvgfcRREMubUp3QxgGfBt4ELgWuBeikDhE4A3AI8E3kTxOR7fUs4TKII03y+n/wP4dEuah9zKsw/bvLGe1wAfKCdXle/zR2V5i4F3Ah+kOP4nyq/K+h5clgVFwKq1zDubJ/rUVjR7HbAXxfs/iWI7Prxcx/MoPuvjI+JsiqDwxRT76m8p2sQjgVdQtDGnUATMWo1S2yRJkqTJlJkODg4ODg4ODg4ODh0GYF+KAFpS9ILplHbLNvP2a8p/LbBDh/zbADNb5r2vKf9Xgelt8u1DERhJikDG3DZprm9az3LgLzrUYzpwZZn2auCRY6R7WLk8KQJ/05qW7dBU3serfm7DMACnN72HdcALu6T/TJn2HuDZY6SZUW7HBNYAC9ukeW9TuX+2vM42bUl/fptlsygCDVnuS3u3STMT+O+mMhN4Vpt0L29a/g4gxqjP0U3pXtlm+flNy+8F9uzy/nZod3w0Ld+IImidFIG6eW3SLGwq87097CPj3uYUQfy7y+UrgCe2WccWwBUtn/2Y+0aXOh/eZft1XN6SdtxtRbn8WS3v7dNjfI4XNX2Od1AEYGe0Sfv1pnU9sWXZlG+bHBwcHBwcHBwchmfwGW2SJElSd823quvUC4PMvL3N7Hc3jb8sM6/rkP/mzFzTmI6ImRS9m6AIoL02M9e2yfcT4N/KyS1Y35NoLO/KzGs7LD+EopcdwBGZ+X9j1PcW1vfUW0QR8GsY7+c2bL6Qmd8ea2FEPAI4opz8UI7RYyczH6ToFfYAReDgiHbpaui2Tbs5mOKWjgAnZuYFrQnKffNIWnp1tdG4xeEPM/P4zGzb0zMzT6DojQRwVJd1fiQzO/bmyszr2h0fTcvvB95WTs6nuN1rbX3c5n8DzCvH35+Zv26zjjvo/hlNhn60Fa2W8ee3jWx8jv9ZTs4AZgOvKee3+vem8dayRq1tkiRJ0iQy0CZJkiR1t6xp/NUREWOmbBERmwN7l5PndwsUtLE7sFU5/l/Z+TlWzbe4e16HdGuAM7qU+5Ly9cbM/J8uac9vGn9603jz5/aqMmg4lX2hy/IDWf/8va90SlhevP/fcvLpndL2qJdt2k3zswU/N1aizFwG/GCs5RHxONYHXjp+DqWflK97RcT0Dum6ff7t6jI3IhZGxOMjYpeI2IWHPv+sl1tgdtKvbf788nUdRS/Ksdbxc4rbIw6TfrQVrb6emWMFcy9vGv9hh0DYkqbx1ufGjVrbJEmSpEnkM9okSZKk7n5OccuzRRS3untBRHyN4hlEv8zMuzrk3Y31f3Dr2HNiDE9sGv9Fp4SZuSwibqR4XteTOiS9JjPv7VLuk8vX7SOibW+kMWzTVJ8bIuJcil5DLwGujYgzKS62X1T2cKktIjajeEZar36fmfeMo8glXZY/uWn8ugrx2G26J+mql23aTeP5cPdR3KKwk19RBJnaaf4cTo2IU3ssfxZFb8xb2yy7JzOX9rKSiNiRojfUgax/BtdYtuqyvJt+bfPGcb60hx5UF7E+kDkMxt1WtHF1h2XN7W2v6TZtXjDRbZMkSZI2LPZokyRJkroob0t2IHBJOWsRcCzwfeCOiFgSEe+NiHYXjrduGr+pRvFbNo0v7yH9zW3ytbqzh/U8rIc07cxpmX4F8KNy/JHAW4BvA3+MiKsi4iNlYKSOF1H0EOp12LNmOQ3dPrd+fWZ19LJNu9mifL0tM9d1SfvHDsvqfg4w9mfR0/uLiJdTBAnfQPcgW6fyetWvbd44XnsJ8PTSDgzSROz3nYLGzfvmmOla9uF2PSUnsm2SJEnSBsQebZIkSVIPMnNpROxJ0QPiYIrbQT6B4gLuk8rh7RFxVGZ+aazVjLcafUo75jOsmjR+K1xMtWeIPSQgUvYM2S8i9qLoOfJMil5+sygClouAf4iId2XmRyqUM3Cdnv1Vanxm6yhu+dnL5wzdn3fWi17L6pdOXbeaf2e+mqL3W6/GCkZ3fX9lUOQ0in3rXuDjwH8DS4E7y+ezERHTmtbXcxe0MfR7m/dyjI+3zv3Wl7Zi0EapbZIkSdLkMtAmSZIk9Sgzk6IHxI8AImIexcXZVwAvo+ih8bmIuCwzryyzNd8Gb7saxTbfRq6XWww20txRo6xmt1LclnGbzPzNONdFZl4IXAgQERsDTwUOpbgwvxFwfET8OjO/X2Gdp9PheVaToLGtp1HhVodDpLHPbBUR07r0atu6w7LmfX56P/afHr2aYl8CeEmHfWnzPpbZr21+O7At8PAe0o6nx+BE6GtbMWgT0TZJkiRpw+KtIyVJkqSaMnNlZp6Tma8E/rGcPZ3iIm3Dpay/1dmzaxTz66bxp3ZKGBHbUTyfDeDyGmU1a9wmc7uI2GWc63qIzLwvM8/LzL8F/rpp0cv6Wc4kuKRp/AWTVov6/rd83RjYuUvaTrfhnKzPofGMuTu7BEW63UK0Ss/Rfr3XxnG+Y0Rs0TElPGUc5fSqzmfQ97Zi0Ea4bZIkSdIEMtAmSZIk9Ufzhf0/9fbJzLuAn5aTz4qIxRXXeynre828LCLmd0j7+qbx/65YTqtvNI2/e5zr6qTt5zZFfZv1tw78h4jox7PXBulHTeOvGitR+SzC53VYz+XAdeX4iyLi8X2oWy8ad2zZqLw95Fje0GU9q5vGNxozVaFf27xxHEyj82f/VLoHQfuhymcwqLZi0EapbZIkSdIEMtAmSZIkdRERz4iIx3VJ1tyb5bqWZR9sGj8jIh7doawFETGzMZ2Za4BPl5NbAie1CyJExN7A28vJ24EvdKlvN18Gri7HD4uIYzsljog5EfHm5rpFxK49BBY7fW5TSmZeB3yunNwB+EpEbDJW+ii8JCIGETjpxbdY/4y0N5VBnYeIiBnAyXQIvpS3WH1vOTkd+GZE7NCp4IjYIyL2r1PpJteUr3MYowdSRLwVOLDLem4H7i/HH9spYR+3+eeBleX4P7cLTkbEZsBJXereL8uaxjt+BvShrRi0Da1tkiRJ0sTyGW2SJElSd88B/ikiLgK+CywBlpfLtgMOBv6mnL4T+FJz5sw8NyL+DXgbxcX4X0fEScAPy/XMAR5HcWH3hcAC4K6mVXwYeBHwJOCvgIUR8UngKmAeReDgjRTBjwRem5mrxvOGM/PBiDgE+DkwH/hgRBxM8Uy0XwOryvmLKJ5T98KyLp9i/a0ydwVOi4j/Bc6muMXcMuDB8j0+HziqTPsAgwsiTKSjgd0p3vsLgavKbf0/FAGcOcBCitv/vYTi2Vb7AVe2W9kgZeYDEfF3wFkU+9J55X72XYrtvTPwZor3dyGwVyNrm3V9ISKeCbwGeAzFPn8a8AOKfWAGxT6wB8XntCvwobKsuj4HvAkI4JSI2J2iV9IdFMfdq4ADgAuAvcdaSbnv/wJ4FnBQRLyZolfqvWWSNZl5bVOWcW/zzLwjIt4CfJbiuPpF2WacS3FsLAbeUa7nV3S//eV4XQbcA2wCvCMibinru6ZcviIzby7r3o+2YtA2xLZJkiRJE8RAmyRJktSboAgs7NUhzR+BQzLzj60LMvPtEXE38E/AXOAt5dBVZt4fEftRBECeBjwZ+GKbpPcBR2XmN3tZbw/lXhERewFnAE+kuLjf6QL/Sto/2+kJrH9+1lj5Ds/M39St67DIzFURsQ9wCvBSiqDK+ztkWUsR0BgKmfmtiHgjcAIwmyK4846WZJ+mCEw0joXVtHcUcCPwHoqAzRvLYSwralYbgMy8NCLeCfwrRd3fWg7NLgEOoThWO/kg8AxgJvDxlmU3UAS8GuX2ZZtn5snlbTnfRxGIel85/CkJcCwwiwkOtGXmPRHxEYqeiY8A/qslyeeAw5vS96utGLQNpm2SJEnSxDHQJkmSJHV3PPALYF/gqRS92B5OccH7TuA3wDnAyZl591grycwPRMSXKZ6l9lyKi/VzgFuAPwDnA18tn+vWmvfW8vaQhwEvp+jhshVFcO33FD13TszMZa15xyMzr4qI3Sh61B1C0Svn4RSBjJXA9RTPkfshcHZmrm3K/mWKW67tSxG0eGSZdw5FUOUqih5On2kXnJyqyn3g0IjYk6IX1TMpghWbUvSKWkaxz5wHfDMzl4+1rsmQmf8eERdQBKmeDTyMolfYpcB/ZubZZe+rhrYBsvIWkh8oe7IdRbEfPBbYnKJn1C0U+8DPgG/1I5iRmR+JiF9R9Lx7KrBFWferKIJAn83MNRHRbT3nRsTTy/XsRdHLaXaH9H3Z5mUbcS7wDxS97rageEbjhRTH908i4r09fBTjlpnvi4hrKAJqTyrrMrND+vG0FYO2QbZNkiRJmhhR/PaRJEmSJKk3EXEqcARFwGxeZt7fJYskSZIkjaRJe/iwJEmSJGnqiYi5FL2WAC4xyCZJkiRpQ2agTZIkSZL0JxHx2A7LZgKnUtz+kXJckiRJkjZY3jpSkiRJkvQnEXEHsAT4FnA5cBcwD9id4llrO5dJLwaelplrJqOekiRJkjQMRjrQFhELgHcBB1I8sH4F8EvgE5l57mTWTZIkSZKGUUTcBczvkuxXwAszc/kAqiRJkiRJQ2tkA20R8UTgPGDLctbdwFyK22UmcExmHtfLuuZtNi+33HbL7gmbbDVnq0rpAe5dc2/lPHNmzhm6Muq68747K+dZm2sr56mzbepY/eDqSulnz5g9QTV5qKr1gnp1u+3e2yrnWZfrKud52CYPq5znxhU3Vkq//fztK5dRR53PbFD78zBb+cDKSunvf7D6Y2Q2mrFR5TzzZs2rnOfmVTdXzrPN3G0q59FoqfP9ufnGm3dPNAluueeWynnqfA/UMcznUMPqujuvq5xnh813mICa9EfV75s63wN1zm2nx/TKebq5++67WbFiBatWrWLNmjU8+OCDAMyYMYNNNtmEzTffnM0335yI6HvZddqBqsfnws0WVi5jUAZ1rl51f4Z6+3TV89thPrcd1Ln6oLbNKKnzHV1new7qd+GwqvMdtWZt9Q7Pg7o2UqduM6fPrJzn+ruur5S+znfUitUrKueZP7vb/2n6o+r1Fxjcsbbs7mWV0m+36XYTVJOHGtS5wDAb1muqGi112s6lVyy9LTO3brdsJANtEbEx8FvgUcBlwF9n5hURsSnwT8Bby6TPz8wfdFvfwp0X5nu++J5KdThy9yOrVRq45KZLKufZY9s9hq6Mus74zRmV86x6YFXlPHW2TR1X33Z1pfSLtlo0QTV5qKr1gnp1O+XSUyrnqbM9j97r6Mp53vTdN1VKf+L+J1Yuo446n9mg9udh9pPrf1Ip/dI7llYuY8ctdqycZ5+F+1TO86GffqhynmOfeWzlPBotdb4/D9vlsAmoyfidcOEJlfPU+R6oY5jPoYbVoV89tHKeM//qzAmoSX9U/b7Ze/u9K5dR51xoUBfKBqVOO7Bk+ZJK6U970WmVyxiUQZ2rV92fod65TdXz22E+tx3Uufqgts0oqfMdffqS0yvnGdTvwmFV54Lk8lXVOz0P6tpI1SAL1Au0HHHWEZXS1/mOOueacyrnOeCxB1TOU0fV6y8wuGPtXT96V6X0H37uhyeoJg81qHOBYTas11TrWLuuxh/ppvX/j3T6c3XazgMXHXhJZi5ut2zauGs0nF5HEWRbBRyUmVcAZObdmfk24Kwy3WBaSEmSJEmSJEmSJI2cUQ20vbJ8/XJmtvuLykfK190j4nEDqpMkSZIkSZIkSZJGyMgF2iJiHtC4T8/3x0h2IdDo877vhFdKkiRJkiRJkiRJI2fkAm3ATkDjqdxXtEuQmeuAxs1edx5EpSRJkiRJkiRJkjRaRjHQtk3T+E0d0jWWbdMhjSRJkiRJkiRJktTWKAbaNmkav69DunvL17ntFkbEURFxcURcvPLOlX2rnCRJkiRJkiRJkkbDKAbaonuS7jLzpMxcnJmL520+rx+rlCRJkiRJkiRJ0ggZxUDbqqbxjTukm9MmvSRJkiRJkiRJktSTUQy0NT+XbdsO6RrLbp7AukiSJEmSJEmSJGlEjWKg7Sogy/HHt0sQEdOAReXklYOolCRJkiRJkiRJkkbLyAXaMnMlcHE5ud8YyZ4CzC/Hz53wSkmSJEmSJEmSJGnkzJjsCkyQLwN7Aq+MiPdnZuvtId9Wvl6SmVd3W9m6XMeqByb+UW5L71haOc8e2+4xdGWoMIh9po46+8CirRZ1T9QHg/rMlq9aPpByVN2K1Ssq56mzTw+rYX4vdbbN/NnzuyfSuI1SmzbMx8Aofc6DMszbcxDqvP8650Kjdq5e51gbpX2tzvsf1Lm6BmPJ8iWV8+yzcJ8JqMnUUee48Xu9ujpt7dxZcyegJv0xStcfhnl/Hua6Dev5wzCfC6xdt7ZynunTpk9ATaaOOm2N11IGo99twMj1aCt9BrgBmAd8JyJ2BoiIeRFxPPCSMt0xk1Q/SZIkSZIkSZIkTXEj2aMtM++LiIMpbgu5O3BFRNwNzKUILiZwTGb+YBKrKUmSJEmSJEmSpClsVHu0kZmXA7sAnwSuAzYCbgfOAfbLzOMmsXqSJEmSJEmSJEma4kayR1tDZi4Hji4HSZIkSZIkSZIkqW9GtkebJEmSJEmSJEmSNJEMtEmSJEmSJEmSJEk1GGiTJEmSJEmSJEmSajDQJkmSJEmSJEmSJNVgoE2SJEmSJEmSJEmqwUCbJEmSJEmSJEmSVIOBNkmSJEmSJEmSJKkGA22SJEmSJEmSJElSDTMmuwJTweoHV7P0jqUTXs6OW+w44WWsemBV5Txr162tnGf6tOmV89SxYO6CgZRTR53PepTU2TZLli+ZgJr8uarbZlDHwDDvz4Myf/b8ynmqtp11js1dF+xaOU8de2+/90DKqWPurLmTXYUpZ8XqFZXz1DkGRsmgjrU6lq9aPtlVmHKGeXvWUfV7etFWiyqXUafd0GgZ1LlAneOzzjnxKJ3fDuq9jNJnVseyu5dVzlPnes2gfq8P8/WUqursm8N8/jSofWAQ5fg51zOsv7/r1GtQbc2g2qdh3m+qqnOtc5+F+0xATaaOQe3P/b7OZY82SZIkSZIkSZIkqQYDbZIkSZIkSZIkSVINBtokSZIkSZIkSZKkGgy0SZIkSZIkSZIkSTUYaJMkSZIkSZIkSZJqMNAmSZIkSZIkSZIk1WCgTZIkSZIkSZIkSarBQJskSZIkSZIkSZJUg4E2SZIkSZIkSZIkqQYDbZIkSZIkSZIkSVINBtokSZIkSZIkSZKkGgy0SZIkSZIkSZIkSTXMmOwKTAXzZs1j7+33nvByFsxdMOFl1Hkf06dNn4Ca9MfyVcsnuwpjGsT2rGPXBbsOpJw622ZQdatazqCOgWHen4fZ3FlzK6VfesfSymXUybPHtntUzjPMhvm7YFjNnz1/IOUMqu0chKrH8yAN4lxw1Azz9qyj6vf0oq0WVS5jUO3GMKvTpq16YNUE1GRy1DnnqLOvDercZpTObwf1XnbcYseBlDOsttt0u8p5XrDjCyrnGdT2HKVz6DrbZpjb50FdsxnEufown6cO82+VYd0/69Rr1M4hR+l3xDAfn8NqUN+d/T7nskebJEmSJEmSJEmSVIOBNkmSJEmSJEmSJKkGA22SJEmSJEmSJElSDQbaJEmSJEmSJEmSpBoMtEmSJEmSJEmSJEk1GGiTJEmSJEmSJEmSajDQJkmSJEmSJEmSJNVgoE2SJEmSJEmSJEmqoVagLSK2iIjnRcRT2izbNiLOiIjlEXFnRHwlIrYdf1UlSZIkSZIkSZKk4VG3R9tRwPeAv2qeGRGzgZ8CLwUeBswv05wfEZuMo56SJEmSJEmSJEnSUKkbaHt++fqllvmHAzsAdwCvB14FLAP+AnhjzbIkSZIkSZIkSZKkoVM30Pbo8vXKlvmHAgm8KzNPyswvAEcAAby4ZlmSJEmSJEmSJEnS0JlRM9/WwF2ZuboxIyJmAE8F1gFnNqU9D1gLLKpbycm2Ntey6oFVE17OcRccVznPifufWCn91678WuUyjn3msZXz1DF31tyBlLOhq7MP7L393pXz1Nmey1ctr5ynjgtuvGAg5VTlMQDnXHNO5TynLzm9UvqX7vzSymUM4jsA6n0PHLn7kZXzrF23tnKeOsfNPgv3qZxH1VU9BmB4t827z3t35TyH7XLYBNTkz9U5BhZtNWVPf/viv5f+92RXoa+qfk+fcOEJE1SThzp6r6MHUs6g1GnTlt6xtP8VmSR1zofrtDWDOrcZpfPbQb2XOueDZ/7Vmd0TTRGDOk8d1t+Ew6zO91qd316jZhDfUUuWL6mcZ1C/B4b5WKt6zjGo66N1rtvVuS5QR51rNgc89oDKeUbp/KHOOVeddmOPbfeonGdD96lffqqv66vboy2A1meu7QHMBi7PzBWNmZmZwApg45plSZIkSZIkSZIkSUOnbqDt/4CZEfHEpnkvKl9/1pwwIqYB84Bba5YlSZIkSZIkSZIkDZ26gbbzKHq1/UdE7BkRLwT+juL5bGe3pN0ZmAn8oXYtJUmSJEmSJEmSpCFT9xlt/wq8AtgLuLCcF8DPM/O8lrQvpAjA/U/NsiRJkiRJkiRJkqShU6tHW2ZeDzwb+AmwGrgFOA04uDldREwHXksRhPvReCoqSZIkSZIkSZIkDZO6PdrIzEuBfbskWwfsWo7fXbcsSZIkSZIkSZIkadjUDrT1IjMTWDGRZUiSJEmSJEmSJEmToW+BtohYCGxdTt5a3l5SkiRJkiRJkiRJGkm1ntHWEBGPjoiTIuJ24FrgwnK4NiJuj4j/jIhH96OikiRJkiRJkiRJ0jCpHWiLiEOB/wWOBDYHomXYHHgt8JsyrSRJkiRJkiRJkjQyagXaImJP4MvAHOAa4ChgETAXmAc8tpx3FbAx8KWI2KMfFZYkSZIkSZIkSZKGQd0ebe8GpgM/AHbNzJMz83eZeW9m3pOZSzPzZGC3Ms0M4D39qXJ3EXF4RGSXYdWg6iNJkiRJkiRJkqTRM6NmvqcDCfxtZt4/VqLMfCAi/g5YCuxds6zxWAPcMcaye3pdyb1r7mXJ8iX9qVEHc2fNnfAylt6xtHKeFatXVM4zf9MxIJUAACAASURBVPb8ynnq1G2YVX0/i7ZaNEE1eajlq5YPbTmDOM7qlDOoY2BQ22bULJi7oFL6Op9z1TLq2nGLHQdSzvRp0yvnWfWA/0+patndyyrn2W7T7SrnGaW2Y1DHWh2D+o4aJaO0b0L191OnTR+18+E66uw3fm6DUeeceJTagVF6L8OszvftoPLUMajfksOqTvtc53y4jkHV7YIbL6icp6phPk8d5roN62+POteH165bWzlPnesCg/rMqh6fg2o36qhzDOy6YNcJqMnUMajvzn5f56obaJsNrMjM33dLmJnXRcRdwEY1yxqP/8nMZ01CuZIkSZIkSZIkSRpxdW8deS2wSUR0DZ5FxGxgE4pebZIkSZIkSZIkSdJIqBtoOx2YCbyuh7RHlWlPr1mWJEmSJEmSJEmSNHTq3jryExTPafu3iJgDnJCZ9zUnKHuyHQ18APgG8MnxVFSSJEmSJEmSJEkaJnUDbacAK4F7gA8Bx0bExcCycvm2wJ7AHGBFmfaUiGhdT2bmkTXr0IvHR8QVwA7Ag8ANwA+BT/byfDlJkiRJkiRJkiRpLHUDbYcDCTQiZ5sA+4yRdjPgVWMsS2AiA21bAVsCdwKbAo8vh9dFxGsy88tjZYyIoyhue8ncredOYBUlSZIkSZIkSZI0FdUNtL2vr7Xov5uAfwa+DvwuMx+IiI2A5wAfAXYGPh8Rf8jMn7ZbQWaeBJwE8LDHPCwHU21JkiRJkiRJkiRNFbUCbZk51IG2zPwB8IOWefcD342InwMXAzsCxwFPG3wNJUmSJEmSJEmSNNVNm+wKDFpmrgD+pZzcKyK2nsz6SJIkSZIkSZIkaWra4AJtpYvK1wAWTmI9JEmSJEmSJEmSNEWNK9AWETMj4vCI+G5ELI+INeWwvJz3qoiY2a/K9lE0jfv8NUmSJEmSJEmSJFUWmfXiTBHxF8A3gcfz0MBVswR+A7wkM6+tVdAEiIgjgFPLyYdl5q2d0i9evDgvvvjiia9YHbvtVi39ZZdNTD0kSRqvbbapnufkk6vnOeCA6nkkDUadduDmm6vnmTevep6VK6vnGVYrVlTPM39+/+uh/oixfo53UPM6gIbUEUdUz3Paaf2vh9QPb3pT9Twnntj/erRz6KHV85x5ZrX0j3lM9TJ+97vqeaRBGdbz7jrH8wUXVM9T57fKoFx9dfU8ixb1vx5TSERckpmL2y2bUXOFmwLnAtsDa4CvAecBfyiTPALYF3gp8ATghxHxpMyc8KMkIiI7RA/Luv9jOfnLbkE2SZIkSZIkSZIkqZ26t458C0WQ7QZgt8x8ZWaekpnfL4dTMvOVwO7AjcCjyjyD8KiIuDAijoyI7RszI2JWRLwA+DnwWGAd8K4B1UmSJEmSJEmSJEkjpm6g7cUUt4V8dWZeOVaizLwCOJLi1pIvqVlWHU8BTgZuiIj7IuI2YBXwPWAX4F7g8Mw8b4B1kiRJkiRJkiRJ0gipdetIYAfg3sz8cbeEmXluRNxb5hmEPwJ/D+wNPAnYGpgP3AP8juKWl/+RmTcMqD6SJEmSJEmSJEkaQXUDbUMrM+8DTiwHSZIkSZIkSZIkaULUvXXktcCciNi3W8KIeA4wB7iuZlmSJEmSJEmSJEnS0KkbaDuL4rlrp0bETmMliognAadQPM/tGzXLkiRJkiRJkiRJkoZO3VtHfhQ4HNgeWBIRZwE/BpYBGwGPAp4N/CVFQO564GPjrKskSZIkSZIkSZI0NGoF2jJzZUQ8F/g68ATgpeXQLMrXXwOHZObK2rWUJEmSJEmSJEmShkzdHm1k5tKIWAwcRhFk2x3Yulx8K3Ap8DXgjMxcM96KSpIkSZIkSZIkScOkdqANoAygfbEcJEmSJEmSJEmSpA3GtMmugCRJkiRJkiRJkjQVRWZOdh2G3uLFi/Piiy+e8HLO+M0ZlfMctsthE1ATjbK169ZWzrPqgVWV88yfPb9ynkFZdveySum323S7CaqJWl1929WV81xw4wWV0h+5+5GVyxiUn1z/k8p59lm4zwTU5M/VaTumT5s+ATVRqzrHzaKtFk1ATcbvnGvOqZzngMceMAE1UT+sWL2icp5hPn+oqs7+XMeoHQOX3HTJhJexx7Z7THgZUl11jgH36eqq/iYEfxeO0jnnIFU9HxqlcyEY7mOtantrWzvc1yxGyTAfN6OkzjnX4u0WX5KZi9stG9etIyNiM+BAYBdgc2Bmh+SZmcN7dVOSJEmSJEmSJEmqoHagLSL+HvgwMLsxq0uWBAy0SZIkSZIkSZIkaSTUCrRFxMuAT5STtwLfB5YBq/tUL0mSJEmSJEmSJGmo1e3RdnT5eibwN5l5f5/qI0mSJEmSJEmSJE0J02rm24XiVpBvNMgmSZIkSZIkSZKkDVHdQNuDwIrMvLWflZEkSZIkSZIkSZKmirqBtiXAvIjYtJ+VkSRJkiRJkiRJkqaKuoG2jwHTgTf0sS6SJEmSJEmSJEnSlDGjTqbMPDsi/gl4X0QkcEJm3tffqkmSJEmSJEmSJEnDq2ugLSLO67B4FfAh4D0RcSWwskPazMznVKyfJEmSJEmSJEmSNJR66dH2rB7SbAzs0SVN9rAeSZIkSZIkSZIkaUroJdB2xITXQpIkSZIkSZIkSZpiItOOZt0sXrw4L/rlRZXyTJ82fYJqM7quvu3qgZSzaKtFAylnQ1dne86dNbdynu023a5ynhWrV1RKP3/2/Mpl1FHnM3N/rs7PWZIGY+26tZXzDPM59LK7l1VKX+ccRfW4bYZX1fOuYT7n8hxytFT9TQiD+104Svyc/Y5yH1Adw3rdToqISzJzcbtlvfRoq1PgVsBiYCPgZ5l5x0SUI0mSJEmSJEmSJE2WaXUyRcReEfHliHhnm2X/D7gOOAf4BnBjRLxifNWUJEmSJEmSJEmShkutQBvw/4DDgLubZ0bEjsCpwFzgQeB+YA5wekTsMo56SpIkSZIkSZIkSUOlbqBt7/L17Jb5r6O4HeVPgC2BzYCvlvOOrlmWJEmSJEmSJEmSNHTqBtoWAGuB1id6HgAk8M+ZuSozHwAat5fcp2ZZkiRJkiRJkiRJ0tCpG2jbAliZmdmYERFbAI+juJ3kzxrzM/MG4F7gEeOopyRJkiRJkiRJkjRU6gba7gHmR8SspnmNHmu/aA7AlR6g6AEnSZIkSZIkSZIkjYS6gbYrgQAOaZp3OMVtI89vThgRc4H5wM01y5IkSZIkSZIkSZKGzoya+b4KPBU4KSL2BrYBDgLWAGe0pH0aRVDud3UrKUmSJEmSJEmSJA2buoG2TwMvBp4JvJ4ikAbw/vKZbM1eRtHT7byaZUmSJEmSJEmSJElDp1agLTPXRMRzgFcAewF3A9/LzJ82p4uImcDGwLeBs8dZV0mSJEmSJEmSJGlo1O3RRmauBb5QDmOlWQO8vG4ZkiRJkiRJkiRJ0rCKzJzsOgy9xYsX58UXXzzZ1ZAkSZIkSZIkSdKARcQlmbm43bJpg66MJEmSJEmSJEmSNAoMtEmSJEmSJEmSJEk1GGiTJEmSJEmSJEmSajDQJkmSJEmSJEmSJNVgoE2SJEmSJEmSJEmqwUCbJEmSJEmSJEmSVIOBNkmSJEmSJEmSJKkGA22SJEmSJEmSJElSDQbaJEmSJEmSJEmSpBoMtEmSJEmSJEmSJEk1GGiTJEmSJEmSJEmSahjaQFtEzIuIF0bEByLiexFxW0RkOTyuh/wREUdFxC8i4q6IWBkRl0XE2yNi1iDegyRJkiRJkiRJkkbXjMmuQAfPAb5ZJ2NEzATOAvYvZz0ArAV2LYdDI2LfzFzVj4pOqmXLqqXfbruJqYckSeO1YkX1PPPn978ekiZP1XNbqHd+a3ujUfKTn1TPs88+/a+HJEnSKBvUbxVNSUPbo610C/Bd4H3AURXyfZAiyLYaOByYA2wCHATcAewJfKafFZUkSZIkSZIkSdKGZZgDbWdn5sMz84DMfC/ww14yRcQC4Ohy8p2Z+bnMXJuF7wCvLpe9PCKe2P9qS5IkSZIkSZIkaUMwtIG2zFxbM+shwEbACuCkNuv9FnANEMAraldQkiRJkiRJkiRJG7ShDbSNw7PL159m5uox0vygfN13APWRJEmSJEmSJEnSCBrFQNvO5esVHdJcWb7uFBExwfWRJEmSJEmSJEnSCBrFQNs25etNHdI0ls0thz8TEUdFxMURcfGtt97az/pJkiRJkiRJkiRpBIxioG2T8vW+DmnubRpvG2jLzJMyc3FmLt566637VjlJkiRJkiRJkiSNhlEMtDXkZFdAkiRJkiRJkiRJo2sUA233lK9zOqRpXrZqAusiSZIkSZIkSZKkETWKgbbG89e27ZCmsWwVBtokSZIkSZIkSZJUwygG2q4sXx/fIc3O5etvM9NbTEqSJEmSJEmSJKmyUQy0/bh8fUZEzB4jzX7l67kDqI8kSZIkSZIkSZJG0CgG2r4B3A9sBrymdWFEHAQsAhL4ymCrJkmSJEmSJEnSBmDt2uqDNAUNdaAtIrZqDMDmTYs2a14WEX96H5m5HDihnDw+Iv46IqaX69sfOK1c9pXM/PUg3ockSZIkSZIkSZJGz4zJrkAXt44x/xct048Grm+afjewC7A/8HngsxGxFphTLv8V8Pr+VVOSJEmSJEmSJEkbmqHu0VZXZq4BDqIIpl1IcSvJBJYA7wT2zsyVk1dDSZIkSZIkSZIkTXVD3aMtM2McedcBnykHSZIkSZIkSZIkqa9GskebJEmSJEmSJEmSNNEMtEmSJEmSJEmSJEk1GGiTJEmSJEmSJEmSajDQJkmSJEmSJEmSJNVgoE2SJEmSJEmSJEmqwUCbJEmSJEmSJEmSVIOBNkmSJEmSJEmSJKkGA22SJEmSJEmSJElSDZGZk12HoRcRtwI3tFm0FXDbgKsjabjYDkgbNtsASbYDkmwHpA2bbYAk24ENw6Myc+t2Cwy0jUNEXJyZiye7HpImj+2AtGGzDZBkOyDJdkDasNkGSLIdkLeOlCRJkiRJkiRJkmow0CZJkiRJkiRJkiTVYKBtfE6a7ApImnS2A9KGzTZAku2AJNsBacNmGyDJdmAD5zPaJEmSJEmSJEmSpBrs0SZJkiRJkiRJkiTVYKBNkiRJkiRJkiRJqsFAmyRJkiRJkiRJklSDgbaKImJBRJwQEddGxOqI+GNEnB0Rz5nsukkan4jYPiLeXB7TN0bE/RGxMiIuj4jjImKbLvlnRcQ7ImJJRKyKiLsi4hcRcVRExKDeh6T+iYi5EfF/EZHlcHiHtLYB0giJiB0i4uMR8dvymF5Rjp8aEfuMkcd2QBoBETEtIo6IiB9FxK0RsaY8ni+KiGMjYl6HvLYD0pCLiHkR8cKI+EBEfC8ibms6339cD/mjPKZ/UR7jKyPisoh4e0TM6iH/4oj4r4i4qby2eGNEnBwRO/bnHUrqpG4bEBGzI+KQ8nj9dfk9f395DJ8REc/qsfznltcebynbgGvLeMPD+/YmNXCRmZNdhykjIp4InAdsWc66G5hLEbBM4JjMPG6SqidpHCLikcANQPOP37uBTYDp5fSdwCGZ+eM2+TelaB/2KGfdC8wAGifZ3wFenJkP9r/2kiZKRHwCOLpp1hGZeXqbdLYB0giJiFcDnwI2LmfdQ3HO35g+JTNf05LHdkAaARExBzgb2Ldp9t3APNb/VrgB2Dczr2vJazsgTQER8SLgm2Ms3ikzr+qQdyZwFrB/OesBYC3rzxF+RdE+rBoj/6uAkynahqRoX+aXi+8BXpiZ5/X+biRVVbcNiIgfAs9tmnU/8CDFtcOGEzLzzR3KPhb4YDm5DlgFbFpO30rRfvym65vQ0LFHW48iYmPg2xRBtsuAXTJzPrA58FGKE+4PR8TzJq+WksahEUw7BzgU2KI8xudQnED/nuJ4PysiFrTJ/1mKH9R3AAdRBOHnAIcDq4EDgfdNYP0l9VlE7A68Ebioh+S2AdKIiIiXUVwA25gi2PYXmTk3M+cAC4C/Bv6nTVbbAWk0vIciyJbAMcBm5e+C2cDLgbuAR1G0E61sB6Sp4xbguxTH5FEV8n2Q4hrBaopjew7FRfaDKI79PYHPtMtY/oH/sxRBti8BD8/MzYCFwA/L9Xw9Irau/G4kVVWnDZgJ/A54B0VAbnZmzgV2BM4s0xwdEX/XLnNE7M/6INtHWX+OsQuwBNga+FZEbFTj/WiS2aOtRxHxZuDjFFHmx2Xmspbl3wReBFyamXu0WYWkIRYR84GFmXn5GMsfRxFknw28NzPf17RsN+DScvLgzPx2S96jgU8A95Vl3DIBb0FSH0XENIoA224UP5Ybx/if9WizDZBGR0Q8DLiK4s81x2Tmh3vMZzsgjYiIuAHYHjg1M49ss/xw4LRycovMvLOcbzsgTRERMT0z1zZNL6T4cy107s2yALge2Ag4OjM/2bL8YIrebgnsmpm/bll+FnAwcDGwV0sd5gJXAo8EPpaZbx3HW5TUwTjagKcDFzbnbVoWwI8o/qzz+8zcoU2aJcCTgLMy88Utyx4B/JbiTzp/n5kn1nhrmkT2aOvdK8vXL7cG2UofKV937+V+zpKGS2auGCvIVi6/CriwnGwNpr+ifL269Qd16SRgBcU/418y3rpKGog3AYuB/8jMy7qktQ2QRsffUgTZrgb+tUI+2wFpdDSejzLW9/8lTeNzmsZtB6Qpot1F8h4dQhFkW0FxTLeu91vANRR3vXpF87KI2Iz1t5v8WGsdyltN/mc5+XKf6ShNnLptQGb+fKy8WfRm+nw5+eiI2KJ5eUQ8niLIBnB8m/x/AL5STr6ydbmGn4G2HpQPOm5cWP/+GMkupPiihYfey13S6Li9fJ3eMv/Z5esP2mXKzPuAn5WTtg/SkIuI7YAPAH8E3t1DFtsAaXQ0ftR+PjPXVchnOyCNjuvL193GWN64NvBH4Kam+bYD0uhrHOc/zczVY6RptAGtx/neFLeda07TqnHNcRtgp1o1lDSZbm8aH+va4QrGfjxFow14ctnLVVOIgbbe7MT6hx5f0S5B+UP86nJy50FUStLgRMQM4Onl5G+a5gfQ6MXatn0oXVm+2j5Iw+9EYB7wtsxc0SmhbYA0OiJiS+Ax5eQFEbFvRHw/Iu6MiHsj4sqIOC4itmrJZzsgjZbPlq9HRMQ/lreYJyJmRcRhFI+USIrzhCyX2Q5IG4bGsdvLcb5TS6+0Rt7lmXk77V3ZNG47IU09+5SvfwRua1nWOKZ/2+EPfY02oPm8QlOEgbbebNM0ftOYqdYv26ZDGklT0xuABcA61ncFB9iU4oHFYPsgTXkRcRDwYuD8zPxiD1lsA6TR8Zim8edRPGPheaz/N+pOwDuBJRHR/C9z2wFptHwC+HeKi1wfBu6KiLsonq32XxTPcXxhy3mC7YC0YWgcu70c53PLoee8Zc/Xu1rSS5oCyjvjvL6cPL3xZ5wmVdqP5vSaIgy09WaTpvH7OqS7t3y1a6c0QiLiicC/lJOfyszmf6/ZPkgjIiI2AT4FrKEIrvfCNkAaHZs1jR9D8W/1p2TmphTH7v7ALcB2wNfL3u5gOyCNlPLZK28G3go8WM6ez/rrJ/OArVuy2Q5IG4bGsd7LcQ4PPdZ7yduc33ZCmiLK3wVfojhub6T4o06r8bQfmgIMtPXGB5BKG6iI2AY4i+JB55dQ/JP9IUmaxlv/rSJpank/sD3w8cy8slvikm2ANDqafxutBV6cmb+E4jbxmfk94NXl8p0oer+C7YA0UiJiAfBz4KMUF82eRHGx6zHAu4AdgFMjovkimu2AtGGpc5w32gnbCGn0nEhx28gHgFeM8QiKXtoA24cpzEBbb1Y1jW/cId2cNuklTVERsQXFQ4ofDfwOOKDNA4+bj/c5jM32QRpiEbErcDTwfxQBt17ZBkijo/n4PCczl7YmyMxzgGvKyee2yWc7IE19nweeDJySmYdn5q8z857MXJqZxwGvK9O9IyJ2KcdtB6QNwz3lay/HOTz0WF/VZnmn/LYT0hQQEf9CccvItcArM/PnYyTtpQ1o7iFvGzDFGGjrTfP9UbftkK6x7OYJrIukASgfev59YBeKbt/Pzcw/tkl6N+tPtm0fpKnrBIrnMB0LRETMbR6a0m1UzmucHNsGSKOj+Zz/6g7pGsseWb7aDkgjIiJ2BvYrJz/eLk1mfgG4neJ6yoHlbNsBacPQOFfo5ThfxUMvlHfNGxEbs/5W1rYT0pCLiGMpersn8NrM/FqH5FXaD7ANmHIMtPXmKtZ33Xx8uwQRMQ1YVE72erspSUOofE7Td4HFwHKKINuN7dKWDzf9bTnZtn0o7Vy+2j5Iw+lR5evngZVthob/LKevBNsAacRcx/pnJvRy25YE2wFpxOzUNP77DumuK18Xgu2AtAFpHLu9HOe/LduG1rwLImLLLnmb00saQhHxD8AHy8mjM/O0Llkax/ROZRyhnUYb0HxeoSnCQFsPMnMlcHE5ud8YyZ5C8YBkgHMnvFKSJkT5D7KzgadR/FP1uZn5uy7Zfly+tm0fImI28Ixy0vZBGj22AdIIyMx1wPnl5OM6JG38ue6Gpnm2A9JoWNc0vn2HdI0/6DT/Gcd2QBp9jeP8GeUx3U6jDWg9zi8A1pTjz6W955WvN+NFdmloRcTrgY+Vk+/KzBN7yNZoP+YDe46RptEGXJSZ94yRRkPKQFvvvly+vjIitmmz/G3l6yWZ2elWM5KGVETMAr4BPBu4C3heZl7RQ9avlK+Pi4gD2yx/LcUX6X3AN/tRV0n9lZkLMzPGGpqSHlHOW9g0zzZAGh1fKF8PiIgdWxdGxAHAY8vJ7zYtsh2QRsOSpvHXtksQEQcBDysnL2paZDsgjb5vAPdT3N7xNa0Ly/ZhEUVvlK80L8vMFaw/d3hLa4+W8s46ry8nv9zSG07SkIiIVwGfLiffXz6/tavMvBK4vJx8e5v1bgu8vJz80njrqcEz0Na7z1D8a3Ue8J3y3u1ExLyIOB54SZnumEmqn6RxiIjpFAH1F1D8M/UvM/PSXvJm5mXAV8vJ0yNi/8Y6I+JvgH8tl308M2/pb80lTTbbAGmknAFcAswAvhkRe0Jxm/iIeAFwSpnul8D/b+/eY+Qq6zCOfx9rC/QCtoBVVK5iImC8IEaRKCCoEEEEYyKo1EREiUa8oaCREI1IRTBeEgNGESFINAoi4q21KAGMCl4wSlRaBYJVAdkqBbX+/OM9I8MyW3ZPaLe7fj/JZPacd97L/LEnM+eZ932vHFTyOiDNDlW1GvhOd3hykjOTPBag26N1GXBBV74G+PpQXa8D0gySZIfBA1g8VPSY4bLhQKyq/kTb2xlgeZLXdvcS6P7nB0vHXVJVvxjR7em0WW3PoV0ndujq7kwL8Xam/ej3rBF1JT2C+lwDkhxD+z4Q4KNVdfoUux3kBsckWZ5kUdfuXrTVtRbRlqc+v+fb0jSKP5CYvCRPp039HqylPAYspAWWBZw22RRb0pYlyQuAq7vD+4B7NvLyW6vqQdO8k2wLrAT27U7dC8wBtuqOvwG8oqr+/YgNWtJmk2Twgen1VXXBiHKvAdIskeSJtM8Eu3en1tH+n+d3xzcDh1bVrePqeR2QZoFuBZsVPHi/tnW0m18Da2k/zLtxXF2vA9IMMfT5/uHsVlVrhurNBS4DDu9O3Q9s4IHPCT8GXtRtQzOq3+OBz9J+1FO0e4uDrWj+ARxZVSsn/04k9dHnGpDkFmC37vzah6l3dFVdO6Lf9wMf7A430P7vt+2O/wocVFU3TXJs2oI4o20KqurnwD7AJ2jp8la0PZyupH3ZNmSTZq7h6+HWwNKNPHYcX7mqxmj7ur2XNhW8aB+4rwdOpH1Y9gu1NEt5DZBmj6q6DXg6cAZwE+0meQE3Au8Dnj0+ZOvqeR2QZoGquoMWlJ0M/AC4i3YDfQy4gXZz7GnjQ7aurtcBaZarqn8BR9CWebye9j9etKVn3wMcMFHI1tX/AvA82gzYtcA2wK3A54BnGLJJW7The4cbu2+4FJg3qoGq+hBtL8crgbtp+cIttLxhH0O2mcsZbZIkSZIkSZIkSVIPzmiTJEmSJEmSJEmSejBokyRJkiRJkiRJknowaJMkSZIkSZIkSZJ6MGiTJEmSJEmSJEmSejBokyRJkiRJkiRJknowaJMkSZIkSZIkSZJ6MGiTJEmSJEmSJEmSejBokyRJkiRJkiRJknowaJMkSZKkaZJkTZJKcuBs7lOSJEmSZiuDNkmSJEmSJEmSJKkHgzZJkiRJkiRJkiSpB4M2SZIkSZIkSZIkqQeDNkmSJEmSJEmSJKkHgzZJkiRJ2gIkWZLknCSrk9yf5PYk5yd5/Ebq7Jrkk0luTnJvknVJfprkPUkWTLH/ZUkqyaru+Pgk1ycZS3JPkhVJXjqJdo5IcnmSPyX5Z5I/J7kiyUsm2e9xSa5Ocmd3/qih174wyVeS3Na1fU+S3ya5LMmJSfyOK0mSJGmz8kuIJEmSJE2/JwI3AG8HHgsUsBPwBuDaJIvHV0hyNPBr4C3AU7rT84BnAR8BrkuytM9gkpwLXADsB2wAFgEHA1cledcEdeYmuQj4OnAksBRYD+wIvAz4VpLlD9PvJ4CLgAOAAP8ZKnsjsAo4BngC8C9gDvBk4OXAZ2jvX5IkSZI2G4M2SZIkSZp+nwTuBvavqgXAQlp49DdgV+DU4Rcn2Q/4EjAXOAvYBVgAzAeeC/wIeBpwYY+xPAM4uWt3SVUtpgVbF3fly5McMKLecuA4YA1wLLCoqrajhXQnAmPAu5O8eoJ+96WFhqcD21fVEmAxLWicD3yse93ngJ2rakFVLQS2Bw4DLmEomJMkSZKkzSFVNd1jkCRJkqT/S0nW0EKytcDeVXXnuPJ3AmcDq6tq96Hz1wDPB95RVeeOaHcxcBNtVtx+VfWTEX0eVFWrhs4vAz7fHX62qk4Y12aAFcBBwIqqOmSobE/gN7Qwbd+qumXEmF4FXAr8qqr2maDfM6vqtBF1n0MLHiHugAAABBxJREFUD/8BbFdVG8a/RpIkSZKmgzPaJEmSJGn6nTc+ZOtc1j3vNthzLcketJBtPW25xIeoqruBq7rDQ3uM58Mj2izgzO7w4CRLhopfR/t+edmokK3zVeB+YO8J9p3bAJwzQd2x7nkubQabJEmSJG0RHj3dA5AkSZIk8eMJzt8+9PdjaDO69u+O5wGr20SzkRZ2z0+a4lj+WFWrJyi7hhaIzaEtMbmyOz8Y0yuTHLaRtucOjemOcWW/q6q/TlDvt91jT9rec5+iBYk3l8u0SJIkSZpGBm2SJEmSNP3WjTpZVfcNBWmDkGowG2wOsHQSbc+f4lhun6igqtYnuRvYAdhxqGgwpoU8EPBNdUx/2Ui/G5IcS5vhtztt5ts5wF1JVgJfBK4wdJMkSZK0ubl0pCRJkiTNLIPvcTdWVSbxWPYI9z9qCt1gTG+b5JhWjWhjo/uudfvM7Qm8BrgQuAVYArwSuBy4Msmcvm9KkiRJkvowaJMkSZKkmWVt97xnkk2xSslOExUk2Zq2hCU8eAbaYEx7bYLx/E9Vra+qi6vq+Kragza77UyggMOAN23K/iVJkiRpPIM2SZIkSZpZruueFwIv3gTt75Jk1wnKDqAtWVnAz0aM6Ygkcx9SaxOpqtVVdRpwaXfqhZurb0mSJEkCgzZJkiRJmlGq6jfA9d3hWUkWTPTaJNsk2apHN6eOaCvAe7vDFVV111DxF4D/0GbDPaTuuHYWT3UwSeY9zEvWd8993qskSZIk9WbQJkmSJEkzz1uB+4F9gB8mOWSwjGSSRyXZO8n7gd8Dj59i22PAG5N8OMl2XZuPo4VpL6LNZjtjuEJV/Rr4eHd4RpJPJ9l9UJ5kYZJDk3wR+PJU3yxweJLrkpyQZJehducnOQE4rjv17R5tS5IkSVJvm2I9f0mSJEnSJlRVP0nyCuAS4JnAd4F/JlkHbAsML99YU2z+xu5xKnBKkjHavmzpyk+pqmtG1DsF2AZ4M3AScFI3ng3AdkP1V01xPAPP7R4kWQ/cN25c3wTO69m2JEmSJPXijDZJkiRJmoGq6irgKcCHgBt4IHgaA64FPgA8tar+0KPttwPLgJ/SfqD5d+D7wGFVdfYEdTZU1Um0fdwuAv4AzKOFb38EvgYcDxw11fEAK4HX0mbV/RK4F1gE3Al8r2v3iKr6d4+2JUmSJKm3VE31x42SJEmSpNkmyTLg88DVVXXg9I5GkiRJkmYGZ7RJkiRJkiRJkiRJPRi0SZIkSZIkSZIkST0YtEmSJEmSJEmSJEk9GLRJkiRJkiRJkiRJPaSqpnsMkiRJkiRJkiRJ0ozjjDZJkiRJkiRJkiSpB4M2SZIkSZIkSZIkqQeDNkmSJEmSJEmSJKkHgzZJkiRJkiRJkiSpB4M2SZIkSZIkSZIkqYf/AruSo2uE3PtpAAAAAElFTkSuQmCC\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of total distances for all shop and helper combinations\n", "# (green = lower score = better, red = high score = bad choice)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(frigo_score, cmap=greenToRed)\n", "plt.title(\"scores – refrigerated items\")\n", "plt.xlabel('helpers')\n", "plt.ylabel('shops')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DescribeResult(nobs=1560, minmax=(0.047620549370841085, 1.0), mean=0.39404257951515825, variance=0.03629694972459201, skewness=0.5651590284958143, kurtosis=-0.17996869422459616)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.describe(frigo_score,axis=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### refrigerated and heavy items on a hot summers day" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "hot_heavy_frigo_score = normPerfectToZero(calcScores(HtoS, StoC, CtoH, totDist, hot_heavy_frigo_weights, hTrolley))" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 2160x2160 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Heatmap of total distances for all shop and helper combinations\n", "# (green = lower score = better, red = high score = bad choice)\n", "plt.figure(figsize = (30,30))\n", "plt.imshow(hot_heavy_frigo_score, cmap=greenToRed)\n", "plt.title(\"scores – refrigerated and heavy items on a hot summers day\")\n", "plt.xlabel('helpers')\n", "plt.ylabel('shops')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DescribeResult(nobs=1560, minmax=(0.050168590988045374, 1.0), mean=0.36525276858627226, variance=0.030269464745680003, skewness=0.5951194092669662, kurtosis=0.06004874094664281)" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.describe(hot_heavy_frigo_score,axis=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### short analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we have a quick look at the heatmaps of our score matrix, we can see that the score matrix seems to represent what it should and makes sense.\n", "\n", "There's shop rows that are either mostly white (shops with medium distance to the customer), white and green (closer shops) or white and red (shops with a larger distance). This is nice.\n", "\n", "**Shops 0 to 5 seem to have the highest scores. It's not as clear anymore that shops 5,4 and 1 are closest to the customer since not only StoC has an effect, but also the total distance.**\n", "\n", "When we look at the rows in the score matrices, we can clearly see that **helpers are either a fit or not**. There's not a single helper that has both red and green scores with different shops. Then there's helper rows that show no color at all, which are probably the ones having a medium distance to the customer.\n", "\n", "Also it's quite striking, that the \"standard case\" and \"refrigerated items case\" look quite alike. This is not surprising, since on the day I calculated this, the weather was not particularly hot. So there's only a minor differnece in weighting taking place.\n", "\n", "Also the \"heavy items case\" and the \"refrigerated and heavy items on a hot summers day case\" share more similarities, with the **extreme combination showing the most differences to the standard case**. This makes sense because there the weighting has the most differences to the standard case.\n", "\n", "**This appears to be a good base for making our recommendations.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### recommendation lists" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can list the **top 20 recommendations** (smallest scores and the corresponding helper shop combination):" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "# function that takes a 2dim numpy array and a number k\n", "# it returns a list with k rows where each row consists of [row index, column index, value]\n", "def findKMinFromNp(originalArray, k):\n", " array=np.copy(originalArray) # copy the numpy array in order not to change the original array\n", " dimArray=len(array[0]) # get number of columns\n", " arrMax=np.amax(array)+1 # get maximum value of array and add 1\n", " \n", " res=[] # initialize results list\n", " for i in range(k): # repeat this step k times\n", " minIndex=array.argmin() #find minimum value in array\n", " row=int(minIndex/dimArray) # determine row index of min value\n", " col=minIndex%dimArray # determine column index of min value\n", " value=array[row][col] # save value\n", " res.append([row, col, value]) # append results in results list in the form [value, row index, column index]\n", " array[row][col]=arrMax # overwrite the min value with a value that is larger than the current maximum\n", " # ...to prevent finding the same minimum in the next iteration \n", " return res" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "def printRecommendation(scores, venues):\n", " for rank, score in enumerate(scores, start=1):\n", " print(rank,'/ shop:',venues.iloc[score[0]]['Venue'],'/ helper:',helperData.iloc[score[1]]['email'])" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / shop: Marcello's Bistro / helper: zrogge@karz.com\n", "2 / shop: Marcello's Bistro / helper: alexeiholsten@web.de\n", "3 / shop: Marcello's Bistro / helper: bbachmann@web.de\n", "4 / shop: Marcello's Bistro / helper: gerlachgerhardt@gmail.com\n", "5 / shop: Marcello's Bistro / helper: angelicabloch@web.de\n", "6 / shop: Marcello's Bistro / helper: iris38@beyer.de\n", "7 / shop: Pizzeria Rapido / helper: vzirme@tlustek.de\n", "8 / shop: Pizzeria Rapido / helper: selmaaustermuehle@googlemail.com\n", "9 / shop: Pizzeria Rapido / helper: alexeiholsten@web.de\n", "10 / shop: Desperado / helper: alexeiholsten@web.de\n" ] } ], "source": [ "standard_recommendation=findKMinFromNp(standard_score,10)\n", "printRecommendation(standard_recommendation, venues)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / shop: Marcello's Bistro / helper: zrogge@karz.com\n", "2 / shop: Marcello's Bistro / helper: bbachmann@web.de\n", "3 / shop: Marcello's Bistro / helper: gerlachgerhardt@gmail.com\n", "4 / shop: Marcello's Bistro / helper: angelicabloch@web.de\n", "5 / shop: Marcello's Bistro / helper: iris38@beyer.de\n", "6 / shop: Marcello's Bistro / helper: alexeiholsten@web.de\n", "7 / shop: Pizzeria Rapido / helper: selmaaustermuehle@googlemail.com\n", "8 / shop: Marcello's Bistro / helper: wally73@heydrich.com\n", "9 / shop: Pizzeria Rapido / helper: zrogge@karz.com\n", "10 / shop: Pizzeria Rapido / helper: kreinberta@paertzelt.net\n" ] } ], "source": [ "heavy_recommendation=findKMinFromNp(heavy_score,10)\n", "printRecommendation(heavy_recommendation, venues)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / shop: Marcello's Bistro / helper: zrogge@karz.com\n", "2 / shop: Marcello's Bistro / helper: alexeiholsten@web.de\n", "3 / shop: Marcello's Bistro / helper: bbachmann@web.de\n", "4 / shop: Marcello's Bistro / helper: gerlachgerhardt@gmail.com\n", "5 / shop: Marcello's Bistro / helper: angelicabloch@web.de\n", "6 / shop: Marcello's Bistro / helper: iris38@beyer.de\n", "7 / shop: Pizzeria Rapido / helper: selmaaustermuehle@googlemail.com\n", "8 / shop: Pizzeria Rapido / helper: vzirme@tlustek.de\n", "9 / shop: Pizzeria Rapido / helper: zrogge@karz.com\n", "10 / shop: Pizzeria Rapido / helper: kreinberta@paertzelt.net\n" ] } ], "source": [ "frigo_recommendation=findKMinFromNp(frigo_score,10)\n", "printRecommendation(frigo_recommendation, venues)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / shop: Marcello's Bistro / helper: zrogge@karz.com\n", "2 / shop: Marcello's Bistro / helper: bbachmann@web.de\n", "3 / shop: Marcello's Bistro / helper: gerlachgerhardt@gmail.com\n", "4 / shop: Marcello's Bistro / helper: angelicabloch@web.de\n", "5 / shop: Marcello's Bistro / helper: iris38@beyer.de\n", "6 / shop: Marcello's Bistro / helper: wally73@heydrich.com\n", "7 / shop: Pizzeria Rapido / helper: selmaaustermuehle@googlemail.com\n", "8 / shop: Pizzeria Rapido / helper: zrogge@karz.com\n", "9 / shop: Pizzeria Rapido / helper: kreinberta@paertzelt.net\n", "10 / shop: Marcello's Bistro / helper: selmaaustermuehle@googlemail.com\n" ] } ], "source": [ "hot_heavy_frigo_recommendation=findKMinFromNp(hot_heavy_frigo_score,10)\n", "printRecommendation(hot_heavy_frigo_recommendation, venues)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now isn't that nice. Already in the top 10 recommendations we can see major differences depending on the circumstances.\n", "\n", "Since Marcello's Bistro is definitely the closest to our customer, it makes sense that the top 6 recommendations are for this shop. But there's quite some differences in helper choice. Obviously because of the helpers having trolleys or not. \n", "\n", "Take for example alexeiholsten@web.de as number 2 recommendation in the standard case. This helper is also number 2 in the \"refrigerated items case\" under not so hot circumstances. In the \"heavy items case\" he's number 6 and in the extreme combo he's not even in the top 10 anymore.\n", "\n", "So this works quite well." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So now we have our list. It further is very easy to get to the details of the shop and the helper, once the decision is made. e.g. here's the details for combo from the top of the list:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Customer Email hungrycustomer1942@bluewin.ch\n", "Neighborhood Latitude 47.4029\n", "Neighborhood Longitude 8.49958\n", "Venue Marcello's Bistro\n", "Venue Latitude 47.403\n", "Venue Longitude 8.49821\n", "Venue Category Café\n", "Name: 5, dtype: object" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "venues.iloc[standard_recommendation[0][0]]" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "address Kappenbühlweg 9, 8049 Zürich\n", "latitude 47.4036\n", "longitude 8.49863\n", "email zrogge@karz.com\n", "Name: 68, dtype: object" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "helperData.iloc[standard_recommendation[0][1]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### create a map of the distances for our top 3 recommendations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now wouldn't it be nice to see the top 3 recommendations visually on our folium map?\n", "\n", "Credit for the following two nice functions, that draw lines with arrows on folium maps, goes to [Bob Haffner](https://medium.com/@bobhaffner/folium-lines-with-arrows-25a0fe88e4e)." ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "def get_arrows(locations, color='blue', size=6, n_arrows=3):\n", " \n", " '''\n", " Get a list of correctly placed and rotated \n", " arrows/markers to be plotted\n", " \n", " Parameters\n", " locations : list of lists of lat lons that represent the \n", " start and end of the line. \n", " eg [[41.1132, -96.1993],[41.3810, -95.8021]]\n", " arrow_color : default is 'blue'\n", " size : default is 6\n", " n_arrows : number of arrows to create. default is 3\n", " Return\n", " list of arrows/markers\n", " '''\n", " \n", " Point = namedtuple('Point', field_names=['lat', 'lon'])\n", " \n", " # creating point from our Point named tuple\n", " p1 = Point(locations[0][0], locations[0][1])\n", " p2 = Point(locations[1][0], locations[1][1])\n", " \n", " # getting the rotation needed for our marker. \n", " # Subtracting 90 to account for the marker's orientation\n", " # of due East(get_bearing returns North)\n", " rotation = get_bearing(p1, p2) - 90\n", " \n", " # get an evenly space list of lats and lons for our arrows\n", " # note that I'm discarding the first and last for aesthetics\n", " # as I'm using markers to denote the start and end\n", " arrow_lats = np.linspace(p1.lat, p2.lat, n_arrows + 2)[1:n_arrows+1]\n", " arrow_lons = np.linspace(p1.lon, p2.lon, n_arrows + 2)[1:n_arrows+1]\n", " \n", " arrows = []\n", " \n", " #creating each \"arrow\" and appending them to our arrows list\n", " for points in zip(arrow_lats, arrow_lons):\n", " arrows.append(folium.RegularPolygonMarker(location=points, \n", " fill_color=color, number_of_sides=3, \n", " radius=size, rotation=rotation))\n", " return arrows" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "def get_bearing(p1, p2):\n", " \n", " '''\n", " Returns compass bearing from p1 to p2\n", " \n", " Parameters\n", " p1 : namedtuple with lat lon\n", " p2 : namedtuple with lat lon\n", " \n", " Return\n", " compass bearing of type float\n", " \n", " Notes\n", " Based on https://gist.github.com/jeromer/2005586\n", " '''\n", " \n", " long_diff = np.radians(p2.lon - p1.lon)\n", " \n", " lat1 = np.radians(p1.lat)\n", " lat2 = np.radians(p2.lat)\n", " \n", " x = np.sin(long_diff) * np.cos(lat2)\n", " y = (np.cos(lat1) * np.sin(lat2) \n", " - (np.sin(lat1) * np.cos(lat2) \n", " * np.cos(long_diff)))\n", " bearing = np.degrees(np.arctan2(x, y))\n", " \n", " # adjusting for compass bearing\n", " if bearing < 0:\n", " return bearing + 360\n", " return bearing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Now we can draw the final map:**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "standard case:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "topHelper=helperData.iloc[standard_recommendation[0][1]]\n", "topVenue=venues.iloc[standard_recommendation[0][0]]\n", "secondHelper=helperData.iloc[standard_recommendation[1][1]]\n", "secondVenue=venues.iloc[standard_recommendation[1][0]]\n", "thirdHelper=helperData.iloc[standard_recommendation[2][1]]\n", "thirdVenue=venues.iloc[standard_recommendation[2][0]]\n", "\n", "p=[]\n", "\n", "p.append([topHelper['latitude'], topHelper['longitude'], topVenue['Venue Latitude'], topVenue['Venue Longitude'], 'green'])\n", "p.append([topVenue['Venue Latitude'], topVenue['Venue Longitude'], custLatitude, custLongitude, 'green'])\n", "p.append([custLatitude, custLongitude, topHelper['latitude'], topHelper['longitude'], 'green'])\n", "\n", "p.append([secondHelper['latitude'], secondHelper['longitude'], secondVenue['Venue Latitude'], secondVenue['Venue Longitude'], 'orange'])\n", "p.append([secondVenue['Venue Latitude'], secondVenue['Venue Longitude'], custLatitude, custLongitude, 'orange'])\n", "p.append([custLatitude, custLongitude, secondHelper['latitude'], secondHelper['longitude'], 'orange'])\n", "\n", "p.append([thirdHelper['latitude'], thirdHelper['longitude'], thirdVenue['Venue Latitude'], thirdVenue['Venue Longitude'], 'red'])\n", "p.append([thirdVenue['Venue Latitude'], thirdVenue['Venue Longitude'], custLatitude, custLongitude, 'red'])\n", "p.append([custLatitude, custLongitude, thirdHelper['latitude'], thirdHelper['longitude'], 'red'])" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><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+ICNtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzggewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQtZHZmLzAuMy4wL2xlYWZsZXQtZHZmLm1hcmtlcnMubWluLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzggPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzQ3LjQwMjg4MzksOC40OTk1ODA4NDc3MjYwMjNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2RjMjMyMTI1NjFhMDRkMWFiOGQ3OWY1ZThlMGM5MGFiID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzJjOWUyOWJiMWU0NmQ1YTMzMjM3NTdlYTQ2N2Y1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjg4MzksOC40OTk1ODA4NDc3MjYwMjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2Q1OGFmMzk2ZTAxNDhjNmI5OGQ3YWE3NWE5Mzg4MDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODhlZDI3MDZhZmViNGRlYThkMmRkY2FlNjVjNDk2ZTEgPSAkKCc8ZGl2IGlkPSJodG1sXzg4ZWQyNzA2YWZlYjRkZWE4ZDJkZGNhZTY1YzQ5NmUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hc3RlaWdzdHJhc3NlIDksIDgwNDkgWnVyaWNoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDU4YWYzOTZlMDE0OGM2Yjk4ZDdhYTc1YTkzODgwNS5zZXRDb250ZW50KGh0bWxfODhlZDI3MDZhZmViNGRlYThkMmRkY2FlNjVjNDk2ZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTcyYzllMjliYjFlNDZkNWEzMzIzNzU3ZWE0NjdmNTAuYmluZFBvcHVwKHBvcHVwXzNkNThhZjM5NmUwMTQ4YzZiOThkN2FhNzVhOTM4ODA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4ZDIzMTNjMTBhMTQ4MTRhNTg4NWI4ZDliOTgwM2RiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0NTg4Miw4LjQ5NTY5OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWI1YjZmNTdmZTAxNGExNGE1MTAzM2UyMWI3NGMwNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWFkNzZiYTIyOTI4NDhiZmFkMTgwODhhMTkwNWE0OWMgPSAkKCc8ZGl2IGlkPSJodG1sXzlhZDc2YmEyMjkyODQ4YmZhZDE4MDg4YTE5MDVhNDljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5vbGVuYTIzQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWI1YjZmNTdmZTAxNGExNGE1MTAzM2UyMWI3NGMwNTMuc2V0Q29udGVudChodG1sXzlhZDc2YmEyMjkyODQ4YmZhZDE4MDg4YTE5MDVhNDljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM4ZDIzMTNjMTBhMTQ4MTRhNTg4NWI4ZDliOTgwM2RiLmJpbmRQb3B1cChwb3B1cF8xYjViNmY1N2ZlMDE0YTE0YTUxMDMzZTIxYjc0YzA1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NWQ0ZTcwYTA0OTg0NWE5OGVlZDE1MDE0YWZjYjBjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjgzMzUsOC40ODYzNjQ3ODgzMzY0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2FjOTE1OTc2MWU2NDBjN2EzNGNmMjI3NmE0MWZkZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjE3Yjg2MmIwMDczNGZhYTk5MGJjZDFmOTcwM2E2ZjYgPSAkKCc8ZGl2IGlkPSJodG1sXzYxN2I4NjJiMDA3MzRmYWE5OTBiY2QxZjk3MDNhNmY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hYmR1bDM3QGxvcmNoLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YWM5MTU5NzYxZTY0MGM3YTM0Y2YyMjc2YTQxZmRkMi5zZXRDb250ZW50KGh0bWxfNjE3Yjg2MmIwMDczNGZhYTk5MGJjZDFmOTcwM2E2ZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDVkNGU3MGEwNDk4NDVhOThlZWQxNTAxNGFmY2IwYzcuYmluZFBvcHVwKHBvcHVwXzdhYzkxNTk3NjFlNjQwYzdhMzRjZjIyNzZhNDFmZGQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3MjgzODdjZDZhODQ1ZmM5ZDEyZDI2NGQ1ODk1ZWUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAxODE4ODk5OTk5OTk1LDguNTAyOTA0MTA5NzQ3MzU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiZmM5MTJhZGFkZTQ0NWM5YTcyNjc1ODg4MTFkZmUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UxMjIyZDZlZWY5OTRjYjdhMDc3NWM1MjMyM2Q4ZDBiID0gJCgnPGRpdiBpZD0iaHRtbF9lMTIyMmQ2ZWVmOTk0Y2I3YTA3NzVjNTIzMjNkOGQwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cm9uMDZAZXR6bGVyLm9yZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JmYzkxMmFkYWRlNDQ1YzlhNzI2NzU4ODgxMWRmZTIuc2V0Q29udGVudChodG1sX2UxMjIyZDZlZWY5OTRjYjdhMDc3NWM1MjMyM2Q4ZDBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3MjgzODdjZDZhODQ1ZmM5ZDEyZDI2NGQ1ODk1ZWUwLmJpbmRQb3B1cChwb3B1cF9jYmZjOTEyYWRhZGU0NDVjOWE3MjY3NTg4ODExZGZlMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kN2JhOGVhZmUwNWY0NGE3ODE1ZDBkYjgxMzQyNjQ0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzkzNjIsOC40Nzc4MjQ0Mjk0NzU0NjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmI4YThiZmQzMTIyNGE2ZmJjMmVjMGUyZDg1NmY0YjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTIyNmY5ZDQ3Y2IxNDliZGIwOTE3Njk5YzViYjE4NWEgPSAkKCc8ZGl2IGlkPSJodG1sX2UyMjZmOWQ0N2NiMTQ5YmRiMDkxNzY5OWM1YmIxODVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGFuaXNsYXcxMUBnb3JsaXR6LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmI4YThiZmQzMTIyNGE2ZmJjMmVjMGUyZDg1NmY0YjAuc2V0Q29udGVudChodG1sX2UyMjZmOWQ0N2NiMTQ5YmRiMDkxNzY5OWM1YmIxODVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3YmE4ZWFmZTA1ZjQ0YTc4MTVkMGRiODEzNDI2NDQ0LmJpbmRQb3B1cChwb3B1cF8yYjhhOGJmZDMxMjI0YTZmYmMyZWMwZTJkODU2ZjRiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YTE2MWY5NzhlNzg0NDA1OGYyNDNmOGVmNTMwMmQ4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTI3ODQ5OTk5OTk5NCw4LjUwMDY1MzQ0OTk5OTk5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOTYwZTE1OTk4NDI0NTEwYWU0ZmE5YWM3ZDY1MzEzZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZTgyOTZiMGVjOGI0MmUzOGY5MTI2OGRjN2NjMGJiMiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGU4Mjk2YjBlYzhiNDJlMzhmOTEyNjhkYzdjYzBiYjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmRvcmxlYm9lcm5lckBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI5NjBlMTU5OTg0MjQ1MTBhZTRmYTlhYzdkNjUzMTNlLnNldENvbnRlbnQoaHRtbF84ZTgyOTZiMGVjOGI0MmUzOGY5MTI2OGRjN2NjMGJiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YTE2MWY5NzhlNzg0NDA1OGYyNDNmOGVmNTMwMmQ4Ny5iaW5kUG9wdXAocG9wdXBfMjk2MGUxNTk5ODQyNDUxMGFlNGZhOWFjN2Q2NTMxM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmExMDdjNTQwNjk4NDU0N2E0ZWM4ZGIzMTVkZDlmZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQ3MDE2LDguNDkyMDgzOTUwODY1Mzg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3NDk0ZmE4ZTA3NzQzYjhiZjZjMTU0Njk5YWFiZjk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1OGEyYzE0MDkxNDQ5NzA4YmU5OTUxZDI1NzQyZTZmID0gJCgnPGRpdiBpZD0iaHRtbF81NThhMmMxNDA5MTQ0OTcwOGJlOTk1MWQyNTc0MmU2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bmtyYXVzZUByZWluaGFyZHQuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NzQ5NGZhOGUwNzc0M2I4YmY2YzE1NDY5OWFhYmY5OS5zZXRDb250ZW50KGh0bWxfNTU4YTJjMTQwOTE0NDk3MDhiZTk5NTFkMjU3NDJlNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmExMDdjNTQwNjk4NDU0N2E0ZWM4ZGIzMTVkZDlmZGQuYmluZFBvcHVwKHBvcHVwXzQ3NDk0ZmE4ZTA3NzQzYjhiZjZjMTU0Njk5YWFiZjk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0ZjgwODdjZWJlZDRjNmY4Nzk1MTAzM2VmMzM0M2U1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3NzA0Myw4LjQ4NTA3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTZiMzZiODg4ODQ4NDBlMzgzYzJjYTNjNjlhNzE2MGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTFlOWMyNjViMjIyNGM1NGExOGI4ZjBmNzFmN2QxNTEgPSAkKCc8ZGl2IGlkPSJodG1sX2ExZTljMjY1YjIyMjRjNTRhMThiOGYwZjcxZjdkMTUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5qb2VyZ2VuNjhAaGV1c2VyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmIzNmI4ODg4NDg0MGUzODNjMmNhM2M2OWE3MTYwYi5zZXRDb250ZW50KGh0bWxfYTFlOWMyNjViMjIyNGM1NGExOGI4ZjBmNzFmN2QxNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDRmODA4N2NlYmVkNGM2Zjg3OTUxMDMzZWYzMzQzZTUuYmluZFBvcHVwKHBvcHVwX2E2YjM2Yjg4ODg0ODQwZTM4M2MyY2EzYzY5YTcxNjBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmMmUwZGI0Zjg3MDQwYjU4Mjk5YjgzYjg2OTY2MThmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzMTE3LDguNDkzNjgxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NmFmMTBlN2Q0NmQ0ZjkxOTFjN2FkMmYyMjRiOTVhNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zODYzYmNhZjgzY2Y0NjhlYTE0OTA5ZDBlYzU2MWI0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzg2M2JjYWY4M2NmNDY4ZWExNDkwOWQwZWM1NjFiNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmt1c2Noa2FybC1hdWd1c3RAaG9semFwZmVsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NmFmMTBlN2Q0NmQ0ZjkxOTFjN2FkMmYyMjRiOTVhNS5zZXRDb250ZW50KGh0bWxfMzg2M2JjYWY4M2NmNDY4ZWExNDkwOWQwZWM1NjFiNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGYyZTBkYjRmODcwNDBiNTgyOTliODNiODY5NjYxOGYuYmluZFBvcHVwKHBvcHVwXzU2YWYxMGU3ZDQ2ZDRmOTE5MWM3YWQyZjIyNGI5NWE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjMWI4YjMzOGJjOTQzY2RhNDhhMDQ5NDUwNzI3NWY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc5M2ViNDE2MzcyNDlmZWJjMzE4NzJhMDg3MDlkNjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjVlODQyZGYwN2I2NGQ0YWFiNzcxNWViOWRmZGZmMWEgPSAkKCc8ZGl2IGlkPSJodG1sX2Y1ZTg0MmRmMDdiNjRkNGFhYjc3MTVlYjlkZmRmZjFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tZXRpbjM0QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjc5M2ViNDE2MzcyNDlmZWJjMzE4NzJhMDg3MDlkNjMuc2V0Q29udGVudChodG1sX2Y1ZTg0MmRmMDdiNjRkNGFhYjc3MTVlYjlkZmRmZjFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjMWI4YjMzOGJjOTQzY2RhNDhhMDQ5NDUwNzI3NWY1LmJpbmRQb3B1cChwb3B1cF9iNzkzZWI0MTYzNzI0OWZlYmMzMTg3MmEwODcwOWQ2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NjkxMzU2ODI0Mjg0ZjhjYjIyNGU0NDZkMTdmYmM2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDM4NTgsOC41MDk0MDYwNTE3ODc4NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzNmN2E1NDdjNjM2NGQxZjlhMGQxY2U5NDdmMjI0NGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJjNTUwMDViNzdjNDg3YWI0OGM4MWQwNTMyOWY1ZjAgPSAkKCc8ZGl2IGlkPSJodG1sX2YyYzU1MDA1Yjc3YzQ4N2FiNDhjODFkMDUzMjlmNWYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tYXJpY2FqdW5ja0BuZXVzY2hhZWZlci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNmN2E1NDdjNjM2NGQxZjlhMGQxY2U5NDdmMjI0NGEuc2V0Q29udGVudChodG1sX2YyYzU1MDA1Yjc3YzQ4N2FiNDhjODFkMDUzMjlmNWYwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2OTEzNTY4MjQyODRmOGNiMjI0ZTQ0NmQxN2ZiYzZkLmJpbmRQb3B1cChwb3B1cF8zM2Y3YTU0N2M2MzY0ZDFmOWEwZDFjZTk0N2YyMjQ0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTBlNzU4MTBiOTI0YTA4OTliNTc2Nzk1YzIxNzI5NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODUxMjA0OTk5OTk5NCw4LjUxMTE0NDQ0Mzk2NzMxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMjFlZWNhZDU5Mzg0Mjc0OWZiNDE4MjZjY2FkOTk1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OGE1MjZmZDIzNWY0ZmRjOGM4YzU4MzRiYWQxODZmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDhhNTI2ZmQyMzVmNGZkYzhjOGM1ODM0YmFkMTg2ZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFib2hsYW5kZXJAc2VpZmVydC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjIxZWVjYWQ1OTM4NDI3NDlmYjQxODI2Y2NhZDk5NTMuc2V0Q29udGVudChodG1sXzQ4YTUyNmZkMjM1ZjRmZGM4YzhjNTgzNGJhZDE4NmY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxMGU3NTgxMGI5MjRhMDg5OWI1NzY3OTVjMjE3Mjk2LmJpbmRQb3B1cChwb3B1cF8yMjFlZWNhZDU5Mzg0Mjc0OWZiNDE4MjZjY2FkOTk1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZjNjZWRkMjIwOGE0OGViYTJkYTkxNWEyNjliZmMyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDI0MTk1LDguNDkzNDkyMjE0MjQ5NDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyMTI5M2U4YTEyYzQ3ZDZhZTRkZTNlMjU1MWVjN2UxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhNjIyNDI5MTk0YjQ3OGE5NzIwNjRmYmNkNTFlOGRiID0gJCgnPGRpdiBpZD0iaHRtbF8zYTYyMjQyOTE5NGI0NzhhOTcyMDY0ZmJjZDUxZThkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RpZmZlbGRvbmFsZEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjIxMjkzZThhMTJjNDdkNmFlNGRlM2UyNTUxZWM3ZTEuc2V0Q29udGVudChodG1sXzNhNjIyNDI5MTk0YjQ3OGE5NzIwNjRmYmNkNTFlOGRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdmM2NlZGQyMjA4YTQ4ZWJhMmRhOTE1YTI2OWJmYzJjLmJpbmRQb3B1cChwb3B1cF82MjEyOTNlOGExMmM0N2Q2YWU0ZGUzZTI1NTFlYzdlMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NWMwMWQ5NmY4NWQ0YzMzYThlNGI5ZTM4N2Q1YmQ5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTUxNzg1MDAwMDAwNSw4LjUwNzgzMTAzNDA2NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1Njc0N2ZhYmFjOTQwYjlhOTA2ODEzM2Y1YjJhYmNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1Yzg0YWIxNjkwODQ5NmFiMTMwZjg0MjE0N2VjNDI2ID0gJCgnPGRpdiBpZD0iaHRtbF85NWM4NGFiMTY5MDg0OTZhYjEzMGY4NDIxNDdlYzQyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+enJ1cHBlcnRAbG9ld2VyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTY3NDdmYWJhYzk0MGI5YTkwNjgxMzNmNWIyYWJjZi5zZXRDb250ZW50KGh0bWxfOTVjODRhYjE2OTA4NDk2YWIxMzBmODQyMTQ3ZWM0MjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjVjMDFkOTZmODVkNGMzM2E4ZTRiOWUzODdkNWJkOWEuYmluZFBvcHVwKHBvcHVwX2M1Njc0N2ZhYmFjOTQwYjlhOTA2ODEzM2Y1YjJhYmNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3YjlhN2Q4M2Q5YzQwYmRhZmJiZmFjMmMyYTExZTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzNTkxMyw4LjUwNzIzNzczODQ4MjA1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZGIyMzJiZWQzZDk0YTQ3OWU3OGJkZDllYWVmODZiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NGUzYzg1OTE4MTY0YTQ3YWUyYTMyZDRiODk2NGExYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjRlM2M4NTkxODE2NGE0N2FlMmEzMmQ0Yjg5NjRhMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJhbGYtZGlldGVya3JldXNlbEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkYjIzMmJlZDNkOTRhNDc5ZTc4YmRkOWVhZWY4NmJjLnNldENvbnRlbnQoaHRtbF82NGUzYzg1OTE4MTY0YTQ3YWUyYTMyZDRiODk2NGExYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84N2I5YTdkODNkOWM0MGJkYWZiYmZhYzJjMmExMWUyMy5iaW5kUG9wdXAocG9wdXBfYWRiMjMyYmVkM2Q5NGE0NzllNzhiZGQ5ZWFlZjg2YmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTQ3MjI3NGZiMWZjNDA0NTkzOGE2MWM0ZTg0ZmJkMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQ4MzM2LDguNTAyMTQ2MDAxODY0MjcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmNmQ3YTJmYzU3NTRjNmI5YTllZDRmNmFiNWZhYzE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0MTExMGI4ZjNhZjRiYTI5YTJkZDE0MWE4ODllNjQyID0gJCgnPGRpdiBpZD0iaHRtbF9kNDExMTBiOGYzYWY0YmEyOWEyZGQxNDFhODg5ZTY0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YmFya2hvbHp2YWxlbnRpbmVAYmFydGguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmNmQ3YTJmYzU3NTRjNmI5YTllZDRmNmFiNWZhYzE1LnNldENvbnRlbnQoaHRtbF9kNDExMTBiOGYzYWY0YmEyOWEyZGQxNDFhODg5ZTY0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDcyMjc0ZmIxZmM0MDQ1OTM4YTYxYzRlODRmYmQxZi5iaW5kUG9wdXAocG9wdXBfZmY2ZDdhMmZjNTc1NGM2YjlhOWVkNGY2YWI1ZmFjMTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTg5YTE3Y2YyYjg0NDNlMzk1NTc3ZTUxODQ2ZGIxNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDI2Mjg1MDAwMDAwMDYsOC41MDU2NTYwNDg5OTA3MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTI3NmRjOWMwMzNiNGU1NDhmMDRkYmNmOTQwZDc4ODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTE0NTcwYTBlMmQzNDY2YzkyODIxMWIxYTk4MWY1ZjkgPSAkKCc8ZGl2IGlkPSJodG1sX2ExNDU3MGEwZTJkMzQ2NmM5MjgyMTFiMWE5ODFmNWY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hbmlrYTM4QHJvaHQuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Mjc2ZGM5YzAzM2I0ZTU0OGYwNGRiY2Y5NDBkNzg4NC5zZXRDb250ZW50KGh0bWxfYTE0NTcwYTBlMmQzNDY2YzkyODIxMWIxYTk4MWY1ZjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTg5YTE3Y2YyYjg0NDNlMzk1NTc3ZTUxODQ2ZGIxNzUuYmluZFBvcHVwKHBvcHVwXzUyNzZkYzljMDMzYjRlNTQ4ZjA0ZGJjZjk0MGQ3ODg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwYzczZGMwMWYyNDRkMzM5NjA2NGE5Y2I5MmJmNmMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWUxNjUxMzcyNTFhNDIzNTgzM2VjZTQ5MWJiMjY1MTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGIyNjQ1MmFjMDAzNGM4NDk3YjZjNzcyMjI0NDljNDAgPSAkKCc8ZGl2IGlkPSJodG1sX2RiMjY0NTJhYzAwMzRjODQ5N2I2Yzc3MjIyNDQ5YzQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5laG9lcmxlQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWUxNjUxMzcyNTFhNDIzNTgzM2VjZTQ5MWJiMjY1MTEuc2V0Q29udGVudChodG1sX2RiMjY0NTJhYzAwMzRjODQ5N2I2Yzc3MjIyNDQ5YzQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcwYzczZGMwMWYyNDRkMzM5NjA2NGE5Y2I5MmJmNmMyLmJpbmRQb3B1cChwb3B1cF9hZTE2NTEzNzI1MWE0MjM1ODMzZWNlNDkxYmIyNjUxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTU2ODc4NjM4Nzc0NjM2OGFlYzY4MzM1NTgzNThkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDA1NjE1LDguNDk1Mzc1ODAyODU2NzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDdmNDUyNjQzNjBhNDFiYThkMDhhNGNiN2JjMDJjNmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjUzNTA0NGZhNTYwNDZlZjg4MGI1Y2MwMTQyNDVhZDEgPSAkKCc8ZGl2IGlkPSJodG1sX2Y1MzUwNDRmYTU2MDQ2ZWY4ODBiNWNjMDE0MjQ1YWQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hbm5lbGkwNUBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3ZjQ1MjY0MzYwYTQxYmE4ZDA4YTRjYjdiYzAyYzZiLnNldENvbnRlbnQoaHRtbF9mNTM1MDQ0ZmE1NjA0NmVmODgwYjVjYzAxNDI0NWFkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTU2ODc4NjM4Nzc0NjM2OGFlYzY4MzM1NTgzNThkYy5iaW5kUG9wdXAocG9wdXBfNDdmNDUyNjQzNjBhNDFiYThkMDhhNGNiN2JjMDJjNmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDdlNjQxMmNlODc4NGYwZDk0Njg0ZjkzOWZjNDUyZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAzOTM2OTk5OTk5OTUsOC40OTAwMTk3NzYyMjg0MTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDQ2MWFhNDdmNWNjNGYxM2ExNjMzYjI5ODRjMjY0NTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBiMTQxNzczNzE3NGQ2ZmE1MjY1YTU5MzQ1YzA3YjIgPSAkKCc8ZGl2IGlkPSJodG1sX2MwYjE0MTc3MzcxNzRkNmZhNTI2NWE1OTM0NWMwN2IyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56cml0dGVyQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDQ2MWFhNDdmNWNjNGYxM2ExNjMzYjI5ODRjMjY0NTIuc2V0Q29udGVudChodG1sX2MwYjE0MTc3MzcxNzRkNmZhNTI2NWE1OTM0NWMwN2IyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3ZTY0MTJjZTg3ODRmMGQ5NDY4NGY5MzlmYzQ1MmU0LmJpbmRQb3B1cChwb3B1cF9kNDYxYWE0N2Y1Y2M0ZjEzYTE2MzNiMjk4NGMyNjQ1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDY2MzdlNDk2ODY0M2U4OWFjMDI0YzRmOTMxM2NhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzk3NzQ1LDguNDk4MzIwMDgwNzY4NzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjNWRmYmM3NmU4NDRjZmRiYzg2ZmEwODhhNmYwN2MzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmYWM3MmJhZjdjYjRmMmFhOGU5MTIwMzZkYWJhYmQyID0gJCgnPGRpdiBpZD0iaHRtbF8yZmFjNzJiYWY3Y2I0ZjJhYThlOTEyMDM2ZGFiYWJkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YmJhY2htYW5uQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmM1ZGZiYzc2ZTg0NGNmZGJjODZmYTA4OGE2ZjA3YzMuc2V0Q29udGVudChodG1sXzJmYWM3MmJhZjdjYjRmMmFhOGU5MTIwMzZkYWJhYmQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwNjYzN2U0OTY4NjQzZTg5YWMwMjRjNGY5MzEzY2FlLmJpbmRQb3B1cChwb3B1cF8yYzVkZmJjNzZlODQ0Y2ZkYmM4NmZhMDg4YTZmMDdjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYjdjZjAxOGRkZmU0ZjhhOTMyM2YwYWMxZjA4Y2VlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjY1MzY0OTk5OTk5Niw4LjQ5MzQ2NDE2MzYwMDYyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYmE1NTEwODNmYzc0YjM4OWVlOTM5OGU2YmJmMjJlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzNjYWE3M2M5ODE0ZGQzYWE3M2QzN2U3MTdhY2MxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDMzY2FhNzNjOTgxNGRkM2FhNzNkMzdlNzE3YWNjMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFoZXNlckBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiYTU1MTA4M2ZjNzRiMzg5ZWU5Mzk4ZTZiYmYyMmU2LnNldENvbnRlbnQoaHRtbF8wMzNjYWE3M2M5ODE0ZGQzYWE3M2QzN2U3MTdhY2MxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYjdjZjAxOGRkZmU0ZjhhOTMyM2YwYWMxZjA4Y2VlYi5iaW5kUG9wdXAocG9wdXBfM2JhNTUxMDgzZmM3NGIzODllZTkzOThlNmJiZjIyZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjYzZjM2MTc5MmFlNDI3YTkxMDdiMWJiMjBkZDBkZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg0NzQwNTAwMDAwMDQsOC41MTE1NjI1NDcxODcwODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2JmYjdkODk0OGFmNDIxMWI0ODZiYjhhZDAwMGNiZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA2OTdhYTc4NWU2NDBkM2JmMTZlNDI5ZjdlOGM3NjkgPSAkKCc8ZGl2IGlkPSJodG1sXzgwNjk3YWE3ODVlNjQwZDNiZjE2ZTQyOWY3ZThjNzY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5xbm9hY2tAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JmYjdkODk0OGFmNDIxMWI0ODZiYjhhZDAwMGNiZWIuc2V0Q29udGVudChodG1sXzgwNjk3YWE3ODVlNjQwZDNiZjE2ZTQyOWY3ZThjNzY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI2M2YzNjE3OTJhZTQyN2E5MTA3YjFiYjIwZGQwZGU5LmJpbmRQb3B1cChwb3B1cF9jYmZiN2Q4OTQ4YWY0MjExYjQ4NmJiOGFkMDAwY2JlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWRhNzg0YzE4NmM0YTI4OWEyYTVmNmEzZjc4NWUzYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjNjFhNjZjMTNkOTRjZDFiMDk2NmM3NTIxNzlmMDczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5NjFkNzZjNTk2YzQzZTU4MDgzNGJmZjU1ZmQ3N2NjID0gJCgnPGRpdiBpZD0iaHRtbF83OTYxZDc2YzU5NmM0M2U1ODA4MzRiZmY1NWZkNzdjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+am9zZWY5NUBib2VybmVyLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGM2MWE2NmMxM2Q5NGNkMWIwOTY2Yzc1MjE3OWYwNzMuc2V0Q29udGVudChodG1sXzc5NjFkNzZjNTk2YzQzZTU4MDgzNGJmZjU1ZmQ3N2NjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VhZGE3ODRjMTg2YzRhMjg5YTJhNWY2YTNmNzg1ZTNiLmJpbmRQb3B1cChwb3B1cF9kYzYxYTY2YzEzZDk0Y2QxYjA5NjZjNzUyMTc5ZjA3Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NjA1N2M3NmM3NDI0YWJjOTg0ODcyNTZmMmY5ZjFiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzI0NTI1LDguNDkyMzE2OTkyMjk0NDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTEzZWI0ZDQ2MDI0NGNjMmIwYTM0ZDU0OTMxZmI0YzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNlNDY5OTk0NGY4NGEzOTllMzljYjZhMzdiNTFkNDQgPSAkKCc8ZGl2IGlkPSJodG1sX2QzZTQ2OTk5NDRmODRhMzk5ZTM5Y2I2YTM3YjUxZDQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tZWluaGFyZGJvbHptYW5uQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTEzZWI0ZDQ2MDI0NGNjMmIwYTM0ZDU0OTMxZmI0YzMuc2V0Q29udGVudChodG1sX2QzZTQ2OTk5NDRmODRhMzk5ZTM5Y2I2YTM3YjUxZDQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc2MDU3Yzc2Yzc0MjRhYmM5ODQ4NzI1NmYyZjlmMWI1LmJpbmRQb3B1cChwb3B1cF85MTNlYjRkNDYwMjQ0Y2MyYjBhMzRkNTQ5MzFmYjRjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NDBlY2VjZjE0NDA0YWQxYmFkN2I1MTRhN2Y4ZmU1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzM1MjUsOC40ODc1NDU5OTIyNzczMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWI5NDA1ZGJhOGY0NDFiZDhiMjAzZGJmYzNjOTFjZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmVhODUxNmQ2ZmNmNDcxYTgxNjkyNGZmNTk2OTIzYWEgPSAkKCc8ZGl2IGlkPSJodG1sXzJlYTg1MTZkNmZjZjQ3MWE4MTY5MjRmZjU5NjkyM2FhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oZW5uZXJob2ZmbWFubkB6aXJtZS5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiOTQwNWRiYThmNDQxYmQ4YjIwM2RiZmMzYzkxY2ZjLnNldENvbnRlbnQoaHRtbF8yZWE4NTE2ZDZmY2Y0NzFhODE2OTI0ZmY1OTY5MjNhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NDBlY2VjZjE0NDA0YWQxYmFkN2I1MTRhN2Y4ZmU1NS5iaW5kUG9wdXAocG9wdXBfYWI5NDA1ZGJhOGY0NDFiZDhiMjAzZGJmYzNjOTFjZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGQwNmYxMzdiZmU3NGY2NDk0NzU0MDA2NmEzZjNhNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAzOTM2OTk5OTk5OTUsOC40OTAwMTk3NzYyMjg0MTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTU3OWYxZGU3ODMzNDg3ZWJkZmRkYWRjOWYwMmI1NzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWI2NGQyNGRkZjg3NDAwMWI3MDA5YmMwMGJjMDhjNTggPSAkKCc8ZGl2IGlkPSJodG1sXzViNjRkMjRkZGY4NzQwMDFiNzAwOWJjMDBiYzA4YzU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53cnVwcGVydEBndWRlLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTc5ZjFkZTc4MzM0ODdlYmRmZGRhZGM5ZjAyYjU3My5zZXRDb250ZW50KGh0bWxfNWI2NGQyNGRkZjg3NDAwMWI3MDA5YmMwMGJjMDhjNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGQwNmYxMzdiZmU3NGY2NDk0NzU0MDA2NmEzZjNhNzUuYmluZFBvcHVwKHBvcHVwXzE1NzlmMWRlNzgzMzQ4N2ViZGZkZGFkYzlmMDJiNTczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4MjBjOWRiODg1MTQwMTlhNjE4MTI4YTRjN2Q4MzAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5OTc4NjUsOC40ODEzMTM1MTgwNTMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjNhZmNlODJkYWFlNGMzNTgxNjI3NDk0OGZlYjg1YTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGNmNTY2NWVkOGUxNDczM2FjODRmZWVjNDg3NmYwM2EgPSAkKCc8ZGl2IGlkPSJodG1sXzhjZjU2NjVlZDhlMTQ3MzNhYzg0ZmVlYzQ4NzZmMDNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5icmlnaXR0ZW1hcmdyYWZAbWFyZ3JhZi5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzYWZjZTgyZGFhZTRjMzU4MTYyNzQ5NDhmZWI4NWE2LnNldENvbnRlbnQoaHRtbF84Y2Y1NjY1ZWQ4ZTE0NzMzYWM4NGZlZWM0ODc2ZjAzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zODIwYzlkYjg4NTE0MDE5YTYxODEyOGE0YzdkODMwMi5iaW5kUG9wdXAocG9wdXBfZjNhZmNlODJkYWFlNGMzNTgxNjI3NDk0OGZlYjg1YTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzA0MTY5ZDFhMDliNDZhMTg0NzlkMjRlMTNmYTZjNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDI2MTMxNSw4LjUwNDkzMTIxMDEyMTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZTBhOTVmMGU1MTE0OTA0YTE2MzBkZTY3N2YzZDBmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmI3NDJkM2QyNTY0MDI5ODljNWEzODQzODliZGMwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWJiNzQyZDNkMjU2NDAyOTg5YzVhMzg0Mzg5YmRjMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFsaWNlNTlAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2UwYTk1ZjBlNTExNDkwNGExNjMwZGU2NzdmM2QwZjYuc2V0Q29udGVudChodG1sX2ViYjc0MmQzZDI1NjQwMjk4OWM1YTM4NDM4OWJkYzA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MwNDE2OWQxYTA5YjQ2YTE4NDc5ZDI0ZTEzZmE2YzYxLmJpbmRQb3B1cChwb3B1cF8zZTBhOTVmMGU1MTE0OTA0YTE2MzBkZTY3N2YzZDBmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYmEzMDY0MmQ0MGY0MDQzYWI3MDczZTliY2Y3MDM2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDkyMTgsOC41MDE2NzQyMDA4NzkzMDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjExM2EzNTEwNGM4NDM5NDk5ZDY1N2I0MTM0YWFhYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjEwYzBiYmQwMjU1NGM3MjlmMjE3ZDM0MTZkOWIwMDYgPSAkKCc8ZGl2IGlkPSJodG1sX2IxMGMwYmJkMDI1NTRjNzI5ZjIxN2QzNDE2ZDliMDA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hdWd1c3Rhc3RhaHJAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIxMTNhMzUxMDRjODQzOTQ5OWQ2NTdiNDEzNGFhYWEzLnNldENvbnRlbnQoaHRtbF9iMTBjMGJiZDAyNTU0YzcyOWYyMTdkMzQxNmQ5YjAwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYmEzMDY0MmQ0MGY0MDQzYWI3MDczZTliY2Y3MDM2Zi5iaW5kUG9wdXAocG9wdXBfMjExM2EzNTEwNGM4NDM5NDk5ZDY1N2I0MTM0YWFhYTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZiNmUyYmRhMDgyNDRiYTkwMmJiZTgyYjkzOTljMGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTNlNGFhODk0OWQ0NzJkODQ3NWMzZDRmNmI0Mzg0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MThkYWU0NThlYzI0NDkxOTMwYTRmNzdjODVhYzdjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTE4ZGFlNDU4ZWMyNDQ5MTkzMGE0Zjc3Yzg1YWM3YzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmRpdHNjaGxlcmlubWVoZGlAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxM2U0YWE4OTQ5ZDQ3MmQ4NDc1YzNkNGY2YjQzODQxLnNldENvbnRlbnQoaHRtbF85MThkYWU0NThlYzI0NDkxOTMwYTRmNzdjODVhYzdjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZmI2ZTJiZGEwODI0NGJhOTAyYmJlODJiOTM5OWMwZC5iaW5kUG9wdXAocG9wdXBfZjEzZTRhYTg5NDlkNDcyZDg0NzVjM2Q0ZjZiNDM4NDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI4NzRlMGU2MGRmNDFiYzk0M2I0N2JlOWIzNjk1NWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAxNjkyLDguNDk0MjcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWQzZmVjOTlkZGY0ZTNlYjQyZDBmZmYzZmY3NTkwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYWRlMmM5MTg3NzM0ZTU1YWZlZDViMDExOWY5Mjk1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmFkZTJjOTE4NzczNGU1NWFmZWQ1YjAxMTlmOTI5NTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnFyaWVobEBzZWlkZWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYWQzZmVjOTlkZGY0ZTNlYjQyZDBmZmYzZmY3NTkwNy5zZXRDb250ZW50KGh0bWxfMmFkZTJjOTE4NzczNGU1NWFmZWQ1YjAxMTlmOTI5NTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzI4NzRlMGU2MGRmNDFiYzk0M2I0N2JlOWIzNjk1NWEuYmluZFBvcHVwKHBvcHVwX2VhZDNmZWM5OWRkZjRlM2ViNDJkMGZmZjNmZjc1OTA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3Y2UwNjNkMGUxZDRlNDZhMWMxOWE1NzlkNDY3ZmRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4MjQ0Myw4LjUwODI0NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDRjNzhhZWM3Zjg2NGM0Mjg0OTgwODU2MmYzNGM0NDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjQ2MWVjZDZjMDMzNDc0NDgwMTZkZjdiMjkwNjY3NzggPSAkKCc8ZGl2IGlkPSJodG1sX2I0NjFlY2Q2YzAzMzQ3NDQ4MDE2ZGY3YjI5MDY2Nzc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5iYXJ0aGtsYXVkaWFAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNGM3OGFlYzdmODY0YzQyODQ5ODA4NTYyZjM0YzQ0Ni5zZXRDb250ZW50KGh0bWxfYjQ2MWVjZDZjMDMzNDc0NDgwMTZkZjdiMjkwNjY3NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjdjZTA2M2QwZTFkNGU0NmExYzE5YTU3OWQ0NjdmZGUuYmluZFBvcHVwKHBvcHVwXzA0Yzc4YWVjN2Y4NjRjNDI4NDk4MDg1NjJmMzRjNDQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5OWVjNmUzNWQ1YTRjNzE4YWY3N2E3NmJiOWY0ZTFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwODQzNzUsOC40OTkzMjA4MzkyOTQ0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTgzOTE1ZGM5YThjNDY3MTlmNjNhNjI4MWQyMTY0ZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTFiZDNiMDFkNjg4NDU1M2FlOWM1NTg5NTBmNDAxZmYgPSAkKCc8ZGl2IGlkPSJodG1sXzExYmQzYjAxZDY4ODQ1NTNhZTljNTU4OTUwZjQwMWZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rcmVpbmJlcnRhQHBhZXJ0emVsdC5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4MzkxNWRjOWE4YzQ2NzE5ZjYzYTYyODFkMjE2NGYyLnNldENvbnRlbnQoaHRtbF8xMWJkM2IwMWQ2ODg0NTUzYWU5YzU1ODk1MGY0MDFmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OTllYzZlMzVkNWE0YzcxOGFmNzdhNzZiYjlmNGUxYy5iaW5kUG9wdXAocG9wdXBfOTgzOTE1ZGM5YThjNDY3MTlmNjNhNjI4MWQyMTY0ZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWIxN2Q1NDgzNmRjNGNkNGJjMjdmMTE0ZDM1NmMwMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY0NjY1NSw4LjUxMDM4ODc5NTYzNzk2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDBiMzNkMTViNzM0ZGMzYTkyZmY1YzEwMGQ0ODkyYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZGIyZTA5MTk1OGY0NDljYTBhMzI4ZWQ1YzYyMzMzMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGRiMmUwOTE5NThmNDQ5Y2EwYTMyOGVkNWM2MjMzMzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5pY29sZWJhcnRoQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDBiMzNkMTViNzM0ZGMzYTkyZmY1YzEwMGQ0ODkyYi5zZXRDb250ZW50KGh0bWxfZGRiMmUwOTE5NThmNDQ5Y2EwYTMyOGVkNWM2MjMzMzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWIxN2Q1NDgzNmRjNGNkNGJjMjdmMTE0ZDM1NmMwMDEuYmluZFBvcHVwKHBvcHVwX2M0MGIzM2QxNWI3MzRkYzNhOTJmZjVjMTAwZDQ4OTJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwMDgxMWE1NTg1NjQzYzdhNDEyZDhlMGY3NWQ1MDUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NTgzMjAwMDAwMDA0LDguNTA0MTI5ODAzMDMwMTk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjMzJkZjk3MDM2MDQ0YzJiZmRlOTc4ZmRlMzIxODdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0NmMyOWRjN2ZhYTQzZDU5ZWIzYjBhMmY2YzhhNTJlID0gJCgnPGRpdiBpZD0iaHRtbF8xNDZjMjlkYzdmYWE0M2Q1OWViM2IwYTJmNmM4YTUyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bmthbGxlcnRAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjMzJkZjk3MDM2MDQ0YzJiZmRlOTc4ZmRlMzIxODdhLnNldENvbnRlbnQoaHRtbF8xNDZjMjlkYzdmYWE0M2Q1OWViM2IwYTJmNmM4YTUyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MDA4MTFhNTU4NTY0M2M3YTQxMmQ4ZTBmNzVkNTA1MS5iaW5kUG9wdXAocG9wdXBfYWMzMmRmOTcwMzYwNDRjMmJmZGU5NzhmZGUzMjE4N2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTU4ZDEzNGE5ZGE0NGIwNjg1ZGU2YmFmZDNiMjFhMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQwNzQ4NSw4LjUwNDU4OTkwODgzNjczNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZmE0NDFmYWE0ZWM0OTA4YjRhMzdkZDMxYjMzODhiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZDBjN2QzNjlhNzk0MGI5YjlmZWZiMWYzNTA1YjlkYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmQwYzdkMzY5YTc5NDBiOWI5ZmVmYjFmMzUwNWI5ZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJpcmdpdHQ1MUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZmE0NDFmYWE0ZWM0OTA4YjRhMzdkZDMxYjMzODhiMS5zZXRDb250ZW50KGh0bWxfMmQwYzdkMzY5YTc5NDBiOWI5ZmVmYjFmMzUwNWI5ZGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTU4ZDEzNGE5ZGE0NGIwNjg1ZGU2YmFmZDNiMjFhMDAuYmluZFBvcHVwKHBvcHVwXzJmYTQ0MWZhYTRlYzQ5MDhiNGEzN2RkMzFiMzM4OGIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3MTgzNzcyOTMyYzQxNzlhMGMwYjk4YzZiY2ZmMTgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2NTQ1OCw4LjUwNjY2ODQwOTA3NjY4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMGEwNmEwMThjMDY0YzJhOTlmOGVmN2Q4NjJjY2Q3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lY2ZiOWM1YjlhZGI0N2FjOTQ1YTIxMTk1YmEzYzJkYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWNmYjljNWI5YWRiNDdhYzk0NWEyMTE5NWJhM2MyZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnBob2x0QGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMGEwNmEwMThjMDY0YzJhOTlmOGVmN2Q4NjJjY2Q3YS5zZXRDb250ZW50KGh0bWxfZWNmYjljNWI5YWRiNDdhYzk0NWEyMTE5NWJhM2MyZGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODcxODM3NzI5MzJjNDE3OWEwYzBiOThjNmJjZmYxODMuYmluZFBvcHVwKHBvcHVwX2QwYTA2YTAxOGMwNjRjMmE5OWY4ZWY3ZDg2MmNjZDdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiZDQxNjc2NGRhNjRlZWZiMDZkNzE4YjQ5NmZhY2VkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE0ODAzNjQ5OTk5OTk2LDguNDgwMDMyNjE4MDAyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ODJmZmM3YTU0ZTc0MzY2YWQ5MDdiMTAzMWRmZDg5YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGExMWI1Y2Y3YTY0NDRmYTY1NjE5Nzc5MDMzYjY4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhhMTFiNWNmN2E2NDQ0ZmE2NTYxOTc3OTAzM2I2ODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhhdXN0ZXJtdWVobGVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ODJmZmM3YTU0ZTc0MzY2YWQ5MDdiMTAzMWRmZDg5Yy5zZXRDb250ZW50KGh0bWxfMDhhMTFiNWNmN2E2NDQ0ZmE2NTYxOTc3OTAzM2I2ODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmJkNDE2NzY0ZGE2NGVlZmIwNmQ3MThiNDk2ZmFjZWQuYmluZFBvcHVwKHBvcHVwXzY4MmZmYzdhNTRlNzQzNjZhZDkwN2IxMDMxZGZkODljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhYzkyMDJkMzExOTRlMWRiNzYyNTBjY2E2ZjlkMDBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEyOTcyOCw4LjQ4MTI1ODM2NTA1MTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzJmMjJmZDMyMTE0NjQ5OTM4MTJhMjFhNWExNzM3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MjJjNmNkNGVkYTk0ZjBjOTFlZWUyOTI1YmE0MjIwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfODIyYzZjZDRlZGE5NGYwYzkxZWVlMjkyNWJhNDIyMDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1vbmphMTVAc2NoYWVmZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjMmYyMmZkMzIxMTQ2NDk5MzgxMmEyMWE1YTE3Mzc1LnNldENvbnRlbnQoaHRtbF84MjJjNmNkNGVkYTk0ZjBjOTFlZWUyOTI1YmE0MjIwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYWM5MjAyZDMxMTk0ZTFkYjc2MjUwY2NhNmY5ZDAwYi5iaW5kUG9wdXAocG9wdXBfNmMyZjIyZmQzMjExNDY0OTkzODEyYTIxYTVhMTczNzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVlNWMyNjc5MTFhNDYyZmFiMzY2NzlkMTk4ZDEyNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTU5MDQ4LDguNTE0MzcyNDk0MDUyODZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg0NWQ4MmE0ZTk1NDhhMThmYzdjOTk0YWVmNjA4ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzc3MTc1MTJhZGU0NGJmMmExNzcyYzhkOGJkMDEzM2EgPSAkKCc8ZGl2IGlkPSJodG1sXzM3NzE3NTEyYWRlNDRiZjJhMTc3MmM4ZDhiZDAxMzNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGVpbmJlcmdqZW5uaWZlckBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4NDVkODJhNGU5NTQ4YTE4ZmM3Yzk5NGFlZjYwOGQ1LnNldENvbnRlbnQoaHRtbF8zNzcxNzUxMmFkZTQ0YmYyYTE3NzJjOGQ4YmQwMTMzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZWU1YzI2NzkxMWE0NjJmYWIzNjY3OWQxOThkMTI2Yy5iaW5kUG9wdXAocG9wdXBfYzg0NWQ4MmE0ZTk1NDhhMThmYzdjOTk0YWVmNjA4ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmU4N2EyNDNkNjM2NDk2NmI3MTFmYzUwZWUzMDJjZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcwNDEwNTAwMDAwMDQsOC40ODMzNzk2NDk5ODkyNjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhkYWYzYTY3NzkxNDQ3MDg0MmNiZWI5NmVjNTUxZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzZlYzZmODI5ODI2NDFjYzgyZGVkNDE1MjQ0MTdhYzggPSAkKCc8ZGl2IGlkPSJodG1sXzc2ZWM2ZjgyOTgyNjQxY2M4MmRlZDQxNTI0NDE3YWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tZWlrYmVpZXJAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4ZGFmM2E2Nzc5MTQ0NzA4NDJjYmViOTZlYzU1MWQyLnNldENvbnRlbnQoaHRtbF83NmVjNmY4Mjk4MjY0MWNjODJkZWQ0MTUyNDQxN2FjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZTg3YTI0M2Q2MzY0OTY2YjcxMWZjNTBlZTMwMmNkOS5iaW5kUG9wdXAocG9wdXBfODhkYWYzYTY3NzkxNDQ3MDg0MmNiZWI5NmVjNTUxZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGYxYmNhMmQ0MjJjNDU5ZWIxNTZhZGMwYTQ5MTljMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY3NzY3NTAwMDAwMDYsOC40OTQxNTgwNDIxMjI4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjFhN2U2OWQ0ODk1NDFlZTk4NTAyMDlkNjc2YzNiOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmE5YjEyZTUzYmMyNGU0ODk2Y2JkOTIwYzIzZjU2MTggPSAkKCc8ZGl2IGlkPSJodG1sX2ZhOWIxMmU1M2JjMjRlNDg5NmNiZDkyMGMyM2Y1NjE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hc2Nob2VubGFuZEBtdWVobGUuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxYTdlNjlkNDg5NTQxZWU5ODUwMjA5ZDY3NmMzYjk2LnNldENvbnRlbnQoaHRtbF9mYTliMTJlNTNiYzI0ZTQ4OTZjYmQ5MjBjMjNmNTYxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZjFiY2EyZDQyMmM0NTllYjE1NmFkYzBhNDkxOWMxZi5iaW5kUG9wdXAocG9wdXBfZjFhN2U2OWQ0ODk1NDFlZTk4NTAyMDlkNjc2YzNiOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVlN2NkMGVjY2YwNGVjMzhlNzMzNzAzOGM3MjczZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY5MTM0NSw4LjUxMTgyMTAzMzk4NzQzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTFmNGI3OTUzYTM0ZmZkOGQ5MmM4YWJkZDA3MmY0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMjMxNTQ5MDk1NmQ0ZjE1YTY5YTA5YTExMDYyODM0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDIzMTU0OTA5NTZkNGYxNWE2OWEwOWExMTA2MjgzNDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmh1ZWJlbGdlb3JnaW9zQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2ExZjRiNzk1M2EzNGZmZDhkOTJjOGFiZGQwNzJmNDAuc2V0Q29udGVudChodG1sXzAyMzE1NDkwOTU2ZDRmMTVhNjlhMDlhMTEwNjI4MzQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzllZTdjZDBlY2NmMDRlYzM4ZTczMzcwMzhjNzI3M2UyLmJpbmRQb3B1cChwb3B1cF8zYTFmNGI3OTUzYTM0ZmZkOGQ5MmM4YWJkZDA3MmY0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZmJiNzk4OWNlZDU0Mzg5YTQ3MjNkYzkyZjg4OTllYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDA2MjA1LDguNTAxNDgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MWNhMDg4ZTZkMWY0NjcxYWMzY2RjNGIxOGNiZDIwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNzg4ZWMxNTlmYzM0YTJjOGI4OGRlY2EwMWY2MjAzNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTc4OGVjMTU5ZmMzNGEyYzhiODhkZWNhMDFmNjIwMzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmthZXRoaXN0b2xsQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDFjYTA4OGU2ZDFmNDY3MWFjM2NkYzRiMThjYmQyMDcuc2V0Q29udGVudChodG1sX2E3ODhlYzE1OWZjMzRhMmM4Yjg4ZGVjYTAxZjYyMDM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmYmI3OTg5Y2VkNTQzODlhNDcyM2RjOTJmODg5OWViLmJpbmRQb3B1cChwb3B1cF80MWNhMDg4ZTZkMWY0NjcxYWMzY2RjNGIxOGNiZDIwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZDU2M2FkMjcyYTM0OWU5OTQzMGRkMGNkNmUyZmNlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTYwOSw4LjUwODAxNTY2MzEzMzk0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTU2OWU2NDkxMjg0YTI2YmNmYzliMzQ1ZWQ3ZTlmOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTYwOGM0YTdiOTg0ZGM5OTQyMDI5YjEyYzhhOTUzYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDU2MDhjNGE3Yjk4NGRjOTk0MjAyOWIxMmM4YTk1M2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmpzY2h1Y2hoYXJkdEB3aWVsb2NoLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTU2OWU2NDkxMjg0YTI2YmNmYzliMzQ1ZWQ3ZTlmOS5zZXRDb250ZW50KGh0bWxfNDU2MDhjNGE3Yjk4NGRjOTk0MjAyOWIxMmM4YTk1M2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWQ1NjNhZDI3MmEzNDllOTk0MzBkZDBjZDZlMmZjZWIuYmluZFBvcHVwKHBvcHVwX2FhNTY5ZTY0OTEyODRhMjZiY2ZjOWIzNDVlZDdlOWY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1NzIzN2ZjMWU1ODRlODBiYzNiNmQ3NWZiNjdhZTNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDExNTkyMjk5OTk5OTk1LDguNDg1NTc4NzI2NDM3NjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2NDAwNjVjNGQxNTQyYjRiNzkxMDVjZDM2NDYxMGY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FkYjMzMGM1Yzk4MDQ5Yjc5YmMxODcwYTI2Nzc3ZjA5ID0gJCgnPGRpdiBpZD0iaHRtbF9hZGIzMzBjNWM5ODA0OWI3OWJjMTg3MGEyNjc3N2YwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bGVvbjcwQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NjQwMDY1YzRkMTU0MmI0Yjc5MTA1Y2QzNjQ2MTBmOS5zZXRDb250ZW50KGh0bWxfYWRiMzMwYzVjOTgwNDliNzliYzE4NzBhMjY3NzdmMDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTU3MjM3ZmMxZTU4NGU4MGJjM2I2ZDc1ZmI2N2FlM2YuYmluZFBvcHVwKHBvcHVwXzY2NDAwNjVjNGQxNTQyYjRiNzkxMDVjZDM2NDYxMGY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5NzdjNjVkNTBkOTRhYjliMWE2Y2ZiMTA5NjgxOTYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDExNTkyMjk5OTk5OTk1LDguNDg1NTc4NzI2NDM3NjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkNWU0NTBhMGM3MTQ0NjI4OTI3MWNlNjczZTIwNjRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwNmRhNmQxMzM2ZjQxZjZhMWJiOWIyM2QxNzczZDE3ID0gJCgnPGRpdiBpZD0iaHRtbF8zMDZkYTZkMTMzNmY0MWY2YTFiYjliMjNkMTc3M2QxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z290dGhhcmQ2NEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkNWU0NTBhMGM3MTQ0NjI4OTI3MWNlNjczZTIwNjRiLnNldENvbnRlbnQoaHRtbF8zMDZkYTZkMTMzNmY0MWY2YTFiYjliMjNkMTc3M2QxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOTc3YzY1ZDUwZDk0YWI5YjFhNmNmYjEwOTY4MTk2MS5iaW5kUG9wdXAocG9wdXBfM2Q1ZTQ1MGEwYzcxNDQ2Mjg5MjcxY2U2NzNlMjA2NGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI0Y2E1ZTRmODFmNDUwODk2ZDI4ZjgyYzUxZjU1MmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDEzOTk0NSw4LjUwMDMxNjcyMzQxNzkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0MDNlNjEzODAwOTQ0ZjBhMWYzMjk5ZDExMjc0NDVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0NTY0NzBiYTVjNDQ0ZjVhMzY1MzUyY2E2ZDlmMWY1ID0gJCgnPGRpdiBpZD0iaHRtbF9kNDU2NDcwYmE1YzQ0NGY1YTM2NTM1MmNhNmQ5ZjFmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+dnppcm1lQHRsdXN0ZWsuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0MDNlNjEzODAwOTQ0ZjBhMWYzMjk5ZDExMjc0NDVlLnNldENvbnRlbnQoaHRtbF9kNDU2NDcwYmE1YzQ0NGY1YTM2NTM1MmNhNmQ5ZjFmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjRjYTVlNGY4MWY0NTA4OTZkMjhmODJjNTFmNTUyYi5iaW5kUG9wdXAocG9wdXBfODQwM2U2MTM4MDA5NDRmMGExZjMyOTlkMTEyNzQ0NWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM2OTU0M2IxOTUxNDI3MmJlM2I0NGU2ZmQwMDlkZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk0OTU4LDguNDg0NTY4MjQ2MzEzMDU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlZGM0MjIyOTRlMjRmOWJhYTlmZGRiNGE3ZTQ4NzBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxYjVlMGRlMDRhMjQ3ODBhZjEyMDc5NmY2Yjk4NDdhID0gJCgnPGRpdiBpZD0iaHRtbF8yMWI1ZTBkZTA0YTI0NzgwYWYxMjA3OTZmNmI5ODQ3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+emt1aGxAbWllcy5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlZGM0MjIyOTRlMjRmOWJhYTlmZGRiNGE3ZTQ4NzBjLnNldENvbnRlbnQoaHRtbF8yMWI1ZTBkZTA0YTI0NzgwYWYxMjA3OTZmNmI5ODQ3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzY5NTQzYjE5NTE0MjcyYmUzYjQ0ZTZmZDAwOWRkMC5iaW5kUG9wdXAocG9wdXBfYmVkYzQyMjI5NGUyNGY5YmFhOWZkZGI0YTdlNDg3MGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODA4M2U0M2E4YjI5NGRjM2EzZjA4OTQyZmYxNzNiYzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTkzNjkyNSw4LjUwODc4NzI3MjEwMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5MmE0ODEyNTVlZDQwYmI4MzY2MTAwYmYzMjZiYmUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q5YTQ0NTJhYzJhNzQ5ODE4ZjE1NjE1NmI5YjRjMzI0ID0gJCgnPGRpdiBpZD0iaHRtbF9kOWE0NDUyYWMyYTc0OTgxOGYxNTYxNTZiOWI0YzMyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGV5ZHJpY2hhbnRvbkBlaGxlcnQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5MmE0ODEyNTVlZDQwYmI4MzY2MTAwYmYzMjZiYmUzLnNldENvbnRlbnQoaHRtbF9kOWE0NDUyYWMyYTc0OTgxOGYxNTYxNTZiOWI0YzMyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MDgzZTQzYThiMjk0ZGMzYTNmMDg5NDJmZjE3M2JjMi5iaW5kUG9wdXAocG9wdXBfOTkyYTQ4MTI1NWVkNDBiYjgzNjYxMDBiZjMyNmJiZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjE2YTQ1ODRmYmVlNDI1MmEyMzg5MzQ3ZmFmN2E3YjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDU1MjExLDguNDk5MDY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNjQxNWIwOTA0MmI0ZGVlOWQxY2I5NjA1YjU3NzkxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTM1YzJjYzc5ZDc0NWY2OGIwYzM2OWRlODY4Yzk5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmUzNWMyY2M3OWQ3NDVmNjhiMGMzNjlkZTg2OGM5OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmRydWJpbm1hcmNlbGxhQHJ1cHBlcnQubmV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjQxNWIwOTA0MmI0ZGVlOWQxY2I5NjA1YjU3NzkxYy5zZXRDb250ZW50KGh0bWxfMmUzNWMyY2M3OWQ3NDVmNjhiMGMzNjlkZTg2OGM5OTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjE2YTQ1ODRmYmVlNDI1MmEyMzg5MzQ3ZmFmN2E3YjUuYmluZFBvcHVwKHBvcHVwX2U2NDE1YjA5MDQyYjRkZWU5ZDFjYjk2MDViNTc3OTFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UyYThhZGQ4NGIxMDQ4MjNhNjIxMzk2MzRiNjMyNDQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk3Njk3MzAwMDAwMDA0LDguNTA3MTQ5NzAwMDAwMDAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3Yjc4NjAzOWMwZDQ1ZWE5MGRmZWNmODQ1YjFmMWJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhOThkY2NhYzYwMjQ4NmE4NGQwZGU2MGMzYzI4MjQyID0gJCgnPGRpdiBpZD0iaHRtbF9mYTk4ZGNjYWM2MDI0ODZhODRkMGRlNjBjM2MyODI0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+eWV0em9sZEBoaWxsZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lN2I3ODYwMzljMGQ0NWVhOTBkZmVjZjg0NWIxZjFiZS5zZXRDb250ZW50KGh0bWxfZmE5OGRjY2FjNjAyNDg2YTg0ZDBkZTYwYzNjMjgyNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTJhOGFkZDg0YjEwNDgyM2E2MjEzOTYzNGI2MzI0NDEuYmluZFBvcHVwKHBvcHVwX2U3Yjc4NjAzOWMwZDQ1ZWE5MGRmZWNmODQ1YjFmMWJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyYzljM2M1YjMwYzQ5OGViYjY3MWM2MjBkMzgwOGM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2NTQ1OCw4LjUwNjY2ODQwOTA3NjY4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOGU4ZjFjOGE0OGI0YzQzYmI2NDVhOWI2NDBkNWIxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MWFhY2NlZWJiNjA0NTVhOTFlZmFmMTE3YTM3ZjU0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDFhYWNjZWViYjYwNDU1YTkxZWZhZjExN2EzN2Y1NDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdvcmFuNTdAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOGU4ZjFjOGE0OGI0YzQzYmI2NDVhOWI2NDBkNWIxOS5zZXRDb250ZW50KGh0bWxfNDFhYWNjZWViYjYwNDU1YTkxZWZhZjExN2EzN2Y1NDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTJjOWMzYzViMzBjNDk4ZWJiNjcxYzYyMGQzODA4YzguYmluZFBvcHVwKHBvcHVwX2U4ZThmMWM4YTQ4YjRjNDNiYjY0NWE5YjY0MGQ1YjE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjMjllMjYxOTE0MTQ2NjRiNDUwMjkwYzYwZDczNmM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2NTkwMjUsOC40OTI0NjM1NDYzMjkyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2NhNjNmZGYwNTA0NGQ2N2E5NjU1MGI2ZjVhYzQ5MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjkzOWU3Mzk1NGMyNGUzN2JhMGY5ZTI1MzIxMDAwMjcgPSAkKCc8ZGl2IGlkPSJodG1sXzY5MzllNzM5NTRjMjRlMzdiYTBmOWUyNTMyMTAwMDI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rbGF1ZGlhaGFydG1hbm5AZ3V0a25lY2h0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NhNjNmZGYwNTA0NGQ2N2E5NjU1MGI2ZjVhYzQ5MTYuc2V0Q29udGVudChodG1sXzY5MzllNzM5NTRjMjRlMzdiYTBmOWUyNTMyMTAwMDI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjMjllMjYxOTE0MTQ2NjRiNDUwMjkwYzYwZDczNmM2LmJpbmRQb3B1cChwb3B1cF83Y2E2M2ZkZjA1MDQ0ZDY3YTk2NTUwYjZmNWFjNDkxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NWUyNTUxOWI2YzA0ZTVhYjdjZjY5OTgxMTkzZjc0MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODUxNTc1LDguNTA4MzYyOTcwOTU3NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVmN2QwN2E1NzljNDRiY2E1MDA5OGM1MGQ2YWRiZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjZkNmMyMmUzMTExNDJhMTkyMTNkYWFhNWQzODEzMTUgPSAkKCc8ZGl2IGlkPSJodG1sXzY2ZDZjMjJlMzExMTQyYTE5MjEzZGFhYTVkMzgxMzE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rYWVzdGVyaGVsZ2FAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1ZjdkMDdhNTc5YzQ0YmNhNTAwOThjNTBkNmFkYmQ3LnNldENvbnRlbnQoaHRtbF82NmQ2YzIyZTMxMTE0MmExOTIxM2RhYWE1ZDM4MTMxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NWUyNTUxOWI2YzA0ZTVhYjdjZjY5OTgxMTkzZjc0MC5iaW5kUG9wdXAocG9wdXBfNjVmN2QwN2E1NzljNDRiY2E1MDA5OGM1MGQ2YWRiZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzJlN2I1ZDk4ZWQ4NDk3ZDg5ZjVmN2I1ZmZkZjM4NWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk5MjY5LDguNDgyMTU2MjAxMzY2MTEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3Zjk2ZTM4NWZlYjQyNTk5ZmVlYmM5OWQ2M2IxMzI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4YjVmY2VjZGNlZTQ4YjFiNjg5YjVjZGViYWM4NWIzID0gJCgnPGRpdiBpZD0iaHRtbF83OGI1ZmNlY2RjZWU0OGIxYjY4OWI1Y2RlYmFjODViMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RvbGxzdGplcGFuQHVsbHJpY2guZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3Zjk2ZTM4NWZlYjQyNTk5ZmVlYmM5OWQ2M2IxMzI1LnNldENvbnRlbnQoaHRtbF83OGI1ZmNlY2RjZWU0OGIxYjY4OWI1Y2RlYmFjODViMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MmU3YjVkOThlZDg0OTdkODlmNWY3YjVmZmRmMzg1Yy5iaW5kUG9wdXAocG9wdXBfZTdmOTZlMzg1ZmViNDI1OTlmZWViYzk5ZDYzYjEzMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2Y4NGUyNTA3ODk4NDVkYWE4MTlhYjc2YzhlYjMzYTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDI0MTEzLDguNDk3NjI4NTA5OTc4MTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0NjZkMGY2ODFkZDRjZmY4M2Q1NWNlODRlMThlNmY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjYzE4NDBmNGY1ZTQ4YTdhZmI0OTNhMjdjYWE0MGMyID0gJCgnPGRpdiBpZD0iaHRtbF80Y2MxODQwZjRmNWU0OGE3YWZiNDkzYTI3Y2FhNDBjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWxleGVpaG9sc3RlbkB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0NjZkMGY2ODFkZDRjZmY4M2Q1NWNlODRlMThlNmY4LnNldENvbnRlbnQoaHRtbF80Y2MxODQwZjRmNWU0OGE3YWZiNDkzYTI3Y2FhNDBjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Zjg0ZTI1MDc4OTg0NWRhYTgxOWFiNzZjOGViMzNhMS5iaW5kUG9wdXAocG9wdXBfMDQ2NmQwZjY4MWRkNGNmZjgzZDU1Y2U4NGUxOGU2ZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjJiNjQwYjM3YjIyNDExNTgxNmZhMjNiYzZhZjA3MTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTQ0NzYyNSw4LjQ3OTU0NjEzMDE2OTY4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDA5ZjIwZGRlNDQ0ODc2OTUyMmViZmViMjI5ZWE5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMThkYjRjOWYwYmU0MzlhOGJjYjg1Y2Q4OTUyOWI5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE4ZGI0YzlmMGJlNDM5YThiY2I4NWNkODk1MjliOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtwZXVrZXJ0QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAwOWYyMGRkZTQ0NDg3Njk1MjJlYmZlYjIyOWVhOTIuc2V0Q29udGVudChodG1sX2QxOGRiNGM5ZjBiZTQzOWE4YmNiODVjZDg5NTI5YjkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyYjY0MGIzN2IyMjQxMTU4MTZmYTIzYmM2YWYwNzEwLmJpbmRQb3B1cChwb3B1cF8zMDA5ZjIwZGRlNDQ0ODc2OTUyMmViZmViMjI5ZWE5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODFkZmM4MGI3NzY0NjNhODA1ODNiNmQ5OWIzYTg2NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjg0NDA1MDAwMDAwNCw4LjQ3ODgxMjkxMTQ1NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83N2UyYTMwMGE2MjQ0OTE0YWVkZDQ2NjRiYWYyZGE3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMWU0MzhiNmMxMDQ0ZmQ2ODMwY2QyZWM5N2Q5MmRhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzFlNDM4YjZjMTA0NGZkNjgzMGNkMmVjOTdkOTJkYTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdlb3JnaW9zc2NobGVpY2hAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83N2UyYTMwMGE2MjQ0OTE0YWVkZDQ2NjRiYWYyZGE3NC5zZXRDb250ZW50KGh0bWxfMzFlNDM4YjZjMTA0NGZkNjgzMGNkMmVjOTdkOTJkYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjgxZGZjODBiNzc2NDYzYTgwNTgzYjZkOTliM2E4NjYuYmluZFBvcHVwKHBvcHVwXzc3ZTJhMzAwYTYyNDQ5MTRhZWRkNDY2NGJhZjJkYTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3ZmNhYzAyYmUzNzRiODZhZTQ1MWIzNDkxZGJmZWE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE1ODI3OSw4LjQ4MTA0MjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDY0NmFlYThlZjI2NGFhNjk1OWNjMDI4ODY1NDg2MTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E4YzNlZTljNTQ5NGFiMGI0NzEzNGVhZDk0ZTczYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzNhOGMzZWU5YzU0OTRhYjBiNDcxMzRlYWQ5NGU3M2FmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oYWVyaW5nYWxpY2VAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY0NmFlYThlZjI2NGFhNjk1OWNjMDI4ODY1NDg2MTYuc2V0Q29udGVudChodG1sXzNhOGMzZWU5YzU0OTRhYjBiNDcxMzRlYWQ5NGU3M2FmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3ZmNhYzAyYmUzNzRiODZhZTQ1MWIzNDkxZGJmZWE2LmJpbmRQb3B1cChwb3B1cF8wNjQ2YWVhOGVmMjY0YWE2OTU5Y2MwMjg4NjU0ODYxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MzA4NTRjYjQ0NmM0ODkzODY4MTQzNjEyYWZjYmZhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjA2NjM1LDguNDkyOTMyMjUxMDU4NjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwNDY0YmYxNmIxNDRjYzZiMjg4NTBkOGEzOWJkYmNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwZjZkOWNmMGM2MzQ0ODA4MjdiOTY4Njc5OWE2OGIwID0gJCgnPGRpdiBpZD0iaHRtbF9jMGY2ZDljZjBjNjM0NDgwODI3Yjk2ODY3OTlhNjhiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWFyaXVzejU2QGtyZWluLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjA0NjRiZjE2YjE0NGNjNmIyODg1MGQ4YTM5YmRiY2Iuc2V0Q29udGVudChodG1sX2MwZjZkOWNmMGM2MzQ0ODA4MjdiOTY4Njc5OWE2OGIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUzMDg1NGNiNDQ2YzQ4OTM4NjgxNDM2MTJhZmNiZmFiLmJpbmRQb3B1cChwb3B1cF82MDQ2NGJmMTZiMTQ0Y2M2YjI4ODUwZDhhMzliZGJjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjQ4NzdjZTA2YWM0MWI0YWMyNjU0Mzc5ZWVjMzQ0YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5OTY3MDIsOC41MDIzNDczNDgyOTY2MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdhZDI3M2U4ODgzNDY1YzgzNTM2ZWI3NDUzZTUzYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWNhZGQ0NTFmNWZiNGUzMzkxNjI4MWQ0ZTI2MmEyODAgPSAkKCc8ZGl2IGlkPSJodG1sXzVjYWRkNDUxZjVmYjRlMzM5MTYyODFkNGUyNjJhMjgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zdGV2ZTM1QHBsYXRoLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTdhZDI3M2U4ODgzNDY1YzgzNTM2ZWI3NDUzZTUzYzguc2V0Q29udGVudChodG1sXzVjYWRkNDUxZjVmYjRlMzM5MTYyODFkNGUyNjJhMjgwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmNDg3N2NlMDZhYzQxYjRhYzI2NTQzNzllZWMzNDRhLmJpbmRQb3B1cChwb3B1cF9hN2FkMjczZTg4ODM0NjVjODM1MzZlYjc0NTNlNTNjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZjYwZDA3ZWY0MWM0ODFmOGM4NzVmZmVmMTMzYzdjMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjAyODQ1LDguNTAzOTMyNzk5NjI3MTMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFhNTUyMWZiZjIxOTQ2NDRhNDRmMDE0MGRlYjFkNGNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxNGNkZThjZjA4ODRiNTU4NzA2ZjQwZjZkMTc0OWZkID0gJCgnPGRpdiBpZD0iaHRtbF80MTRjZGU4Y2YwODg0YjU1ODcwNmY0MGY2ZDE3NDlmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cWJlbmRlckB3ZWlzcy5vcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhNTUyMWZiZjIxOTQ2NDRhNDRmMDE0MGRlYjFkNGNhLnNldENvbnRlbnQoaHRtbF80MTRjZGU4Y2YwODg0YjU1ODcwNmY0MGY2ZDE3NDlmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZjYwZDA3ZWY0MWM0ODFmOGM4NzVmZmVmMTMzYzdjMi5iaW5kUG9wdXAocG9wdXBfMWE1NTIxZmJmMjE5NDY0NGE0NGYwMTQwZGViMWQ0Y2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWM5Y2VhYzY4NTMwNDE2M2EwODE3YzlmOTQzMzg4NjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDkyMjIwNSw4LjQ4NDgwNjQ1NzY0NTE2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZGE4YjBmYWE0OWM0ZmM1OTJhYTkxZjNkY2FlZjdhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMWMwNzRkNGI4MmM0OTA0YjgwMjIzZGE2NWQ2YTYzNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjFjMDc0ZDRiODJjNDkwNGI4MDIyM2RhNjVkNmE2MzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmVocmVuZnJpZWQyOEBob2x0LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZGE4YjBmYWE0OWM0ZmM1OTJhYTkxZjNkY2FlZjdhNC5zZXRDb250ZW50KGh0bWxfZjFjMDc0ZDRiODJjNDkwNGI4MDIyM2RhNjVkNmE2MzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWM5Y2VhYzY4NTMwNDE2M2EwODE3YzlmOTQzMzg4NjcuYmluZFBvcHVwKHBvcHVwX2ZkYThiMGZhYTQ5YzRmYzU5MmFhOTFmM2RjYWVmN2E0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5OWExMTQ4Njc0YzQ1MzE4ZDc5OWVjNDlmMGFlYTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2ODQ0MDUwMDAwMDA0LDguNDc4ODEyOTExNDU1OTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2ZDMzMGVjYzJlMjQ4Y2FhNzZkMzVhZTlhYWI3ZDM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3YjU2OTY0OTNkNjRjYmQ4YmM1YmM1ODBjZjBjNTE5ID0gJCgnPGRpdiBpZD0iaHRtbF9kN2I1Njk2NDkzZDY0Y2JkOGJjNWJjNTgwY2YwYzUxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bGlkaWEwOEBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2ZDMzMGVjYzJlMjQ4Y2FhNzZkMzVhZTlhYWI3ZDM3LnNldENvbnRlbnQoaHRtbF9kN2I1Njk2NDkzZDY0Y2JkOGJjNWJjNTgwY2YwYzUxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OTlhMTE0ODY3NGM0NTMxOGQ3OTllYzQ5ZjBhZWEyMy5iaW5kUG9wdXAocG9wdXBfNjZkMzMwZWNjMmUyNDhjYWE3NmQzNWFlOWFhYjdkMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzQ4OGM2YWUzNTBlNDNmM2FlZTRlY2I5MjMxNjlmMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk5MjY5LDguNDgyMTU2MjAxMzY2MTEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxOTA2MjY3ZGMxODQxYTE4N2M3Y2M0YTM1ZjE5NzJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk0MTY3Y2E3NDljZDRhNGJhZTIzYzUyYmFjODE3NTNjID0gJCgnPGRpdiBpZD0iaHRtbF85NDE2N2NhNzQ5Y2Q0YTRiYWUyM2M1MmJhYzgxNzUzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+dHJhdXRlNDVAaGVzc2UuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTkwNjI2N2RjMTg0MWExODdjN2NjNGEzNWYxOTcyZC5zZXRDb250ZW50KGh0bWxfOTQxNjdjYTc0OWNkNGE0YmFlMjNjNTJiYWM4MTc1M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzQ4OGM2YWUzNTBlNDNmM2FlZTRlY2I5MjMxNjlmMmQuYmluZFBvcHVwKHBvcHVwXzQxOTA2MjY3ZGMxODQxYTE4N2M3Y2M0YTM1ZjE5NzJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1NmMzNTIwNjFkZDRhMThiZTE1NjUwNzhiNjA3Y2Q1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk3NTUwOTQ5OTk5OTk2LDguNTEyOTQwNDg1OTc0MjA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmZGJlNDZkNTVmZDQxMDQ4ZjJlOTAxOGNkMDIyZmE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViMmE0ODQ0YTg0ODRiM2ZhNDI1NWY0YmQzZjAzOGFkID0gJCgnPGRpdiBpZD0iaHRtbF81YjJhNDg0NGE4NDg0YjNmYTQyNTVmNGJkM2YwMzhhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RhaHJoaWxkZUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmZGJlNDZkNTVmZDQxMDQ4ZjJlOTAxOGNkMDIyZmE5LnNldENvbnRlbnQoaHRtbF81YjJhNDg0NGE4NDg0YjNmYTQyNTVmNGJkM2YwMzhhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NTZjMzUyMDYxZGQ0YTE4YmUxNTY1MDc4YjYwN2NkNS5iaW5kUG9wdXAocG9wdXBfYWZkYmU0NmQ1NWZkNDEwNDhmMmU5MDE4Y2QwMjJmYTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDE5NjQyNzM3ODc1NGY5NGJiMzU2NGRjMmU4NjkzOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQwNDksOC41MDA3NjM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkZGU4ZWM3ZGUxNTQ5YzRhMzFiYjg4NTIwZjgyNTdmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhZDJhZGQyOTRkYjRjZTc5MmYxNzhiNTVlNzYzMTc2ID0gJCgnPGRpdiBpZD0iaHRtbF82YWQyYWRkMjk0ZGI0Y2U3OTJmMTc4YjU1ZTc2MzE3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2FsbHk3M0BoZXlkcmljaC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhkZGU4ZWM3ZGUxNTQ5YzRhMzFiYjg4NTIwZjgyNTdmLnNldENvbnRlbnQoaHRtbF82YWQyYWRkMjk0ZGI0Y2U3OTJmMTc4YjU1ZTc2MzE3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMTk2NDI3Mzc4NzU0Zjk0YmIzNTY0ZGMyZTg2OTM4Yi5iaW5kUG9wdXAocG9wdXBfOGRkZThlYzdkZTE1NDljNGEzMWJiODg1MjBmODI1N2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTkzNmJhNTk1N2VmNGIzNjkzZjVmNTc0OGJjNmZhOTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM1NzI5LDguNDk4NjI2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTY0ZDE2MjM3ZTA0ZWY5OTFlNzlmMWYwNmE2ZWFkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWIzNjg4MjhmYjk0OWYwYTAxYmMxMjNhYWNhZWE4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDliMzY4ODI4ZmI5NDlmMGEwMWJjMTIzYWFjYWVhODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnpyb2dnZUBrYXJ6LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmU2NGQxNjIzN2UwNGVmOTkxZTc5ZjFmMDZhNmVhZGMuc2V0Q29udGVudChodG1sXzQ5YjM2ODgyOGZiOTQ5ZjBhMDFiYzEyM2FhY2FlYTgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5MzZiYTU5NTdlZjRiMzY5M2Y1ZjU3NDhiYzZmYTkxLmJpbmRQb3B1cChwb3B1cF9iZTY0ZDE2MjM3ZTA0ZWY5OTFlNzlmMWYwNmE2ZWFkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZjZmMzQwYTQ0ODE0MTFhYjkyMmM5OGZkNjE3NmE5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTkyNjksOC40ODIxNTYyMDEzNjYxMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmEwOTZiYzA2YzI3NDJjOGE0OWFhYWI5ZDI3NTY1ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGQ4NmMzNzFiZjk2NDk4OWJlNzU4MmVlZjA0NmQzN2MgPSAkKCc8ZGl2IGlkPSJodG1sXzhkODZjMzcxYmY5NjQ5ODliZTc1ODJlZWYwNDZkMzdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5pcm1hc2NoZWliZUBzY2h3aXRhbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhMDk2YmMwNmMyNzQyYzhhNDlhYWFiOWQyNzU2NWZkLnNldENvbnRlbnQoaHRtbF84ZDg2YzM3MWJmOTY0OTg5YmU3NTgyZWVmMDQ2ZDM3Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZjZmMzQwYTQ0ODE0MTFhYjkyMmM5OGZkNjE3NmE5Mi5iaW5kUG9wdXAocG9wdXBfYmEwOTZiYzA2YzI3NDJjOGE0OWFhYWI5ZDI3NTY1ZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjk0Njg4M2YxNDUxNDAyZmE5NDE0MmUwMTViM2IwMGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk5MjY5LDguNDgyMTU2MjAxMzY2MTEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxYTVkNTRhNmIyMjQwNmFhMTI0YzFjZDA0MTQzZWI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU1YWRmZTk5MzE3ZjQ1YmM5ZDgwNmNjMDZlOGFjM2UwID0gJCgnPGRpdiBpZD0iaHRtbF81NWFkZmU5OTMxN2Y0NWJjOWQ4MDZjYzA2ZThhYzNlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+em9yYmFjaGthcmwtZnJpZWRyaWNoQHRsdXN0ZWsuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxYTVkNTRhNmIyMjQwNmFhMTI0YzFjZDA0MTQzZWI1LnNldENvbnRlbnQoaHRtbF81NWFkZmU5OTMxN2Y0NWJjOWQ4MDZjYzA2ZThhYzNlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTQ2ODgzZjE0NTE0MDJmYTk0MTQyZTAxNWIzYjAwZC5iaW5kUG9wdXAocG9wdXBfNjFhNWQ1NGE2YjIyNDA2YWExMjRjMWNkMDQxNDNlYjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTJjZGM0NDU4OGQxNGY4YjgwN2VjMzg0MTVkOGQwNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTU5MTU4NSw4LjUwMzgxNDc5NjI4NTc5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjVmMWE0MjY5Y2U0NDI2YTI5NDE3MzJhNDAzNjFkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YzU1MzMxNDlhNzY0MjE4OGUzMzZjNTQ0MmQyMWNkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWM1NTMzMTQ5YTc2NDIxODhlMzM2YzU0NDJkMjFjZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhlaW56LWdlb3JncG9lbGl0ekBmaWViaWcuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjVmMWE0MjY5Y2U0NDI2YTI5NDE3MzJhNDAzNjFkMC5zZXRDb250ZW50KGh0bWxfNWM1NTMzMTQ5YTc2NDIxODhlMzM2YzU0NDJkMjFjZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTJjZGM0NDU4OGQxNGY4YjgwN2VjMzg0MTVkOGQwNWIuYmluZFBvcHVwKHBvcHVwXzQyNWYxYTQyNjljZTQ0MjZhMjk0MTczMmE0MDM2MWQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5YzBjNzM0OTUwODQ4ZGU4ZjVkMWI2MDY3MzdlY2EwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMTY5Miw4LjQ5NDI3MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjQzYjRkNTY5OWM2NGYzMzkzYjc0ZmViMzcyODQyYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzJkYzFmODA0MzJmNDExZmI2YzQ1MjUyZDBlYWJiZGUgPSAkKCc8ZGl2IGlkPSJodG1sX2MyZGMxZjgwNDMyZjQxMWZiNmM0NTI1MmQwZWFiYmRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5naWVzZWxhMTFAam9oYW5uLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQzYjRkNTY5OWM2NGYzMzkzYjc0ZmViMzcyODQyYjguc2V0Q29udGVudChodG1sX2MyZGMxZjgwNDMyZjQxMWZiNmM0NTI1MmQwZWFiYmRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY5YzBjNzM0OTUwODQ4ZGU4ZjVkMWI2MDY3MzdlY2EwLmJpbmRQb3B1cChwb3B1cF9iNDNiNGQ1Njk5YzY0ZjMzOTNiNzRmZWIzNzI4NDJiOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZDE1NzFkYzE3NmI0YTA2YTdjYzgzYjcwYTBhMTZiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzkzNjIsOC40Nzc4MjQ0Mjk0NzU0NjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2M3YjI4NzIzNDU1NDY4ZGJlM2FjMGM3ODlmZTIyNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGJlYTNiZWJhODlkNDZlOTlmZTQ0ZjViMTk4NWVhYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzRiZWEzYmViYTg5ZDQ2ZTk5ZmU0NGY1YjE5ODVlYWJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5jYW1pbGxhcnVkb2xwaEBqZXNzZWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYzdiMjg3MjM0NTU0NjhkYmUzYWMwYzc4OWZlMjI1My5zZXRDb250ZW50KGh0bWxfNGJlYTNiZWJhODlkNDZlOTlmZTQ0ZjViMTk4NWVhYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGQxNTcxZGMxNzZiNGEwNmE3Y2M4M2I3MGEwYTE2YjEuYmluZFBvcHVwKHBvcHVwXzNjN2IyODcyMzQ1NTQ2OGRiZTNhYzBjNzg5ZmUyMjUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhYzExZWU4NmI3ZTRhNmU4OTkxYmFjZmJlYjFhNzg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMTY5Miw4LjQ5NDI3MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzczN2ZkMGUxMTNhNDY0YWFkZGFiMzZjZTEzNzc5YTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzAzNjdiNGZjZDhjNDYwYmI5OWM4MGRmMWVhYjM0MzggPSAkKCc8ZGl2IGlkPSJodG1sXzcwMzY3YjRmY2Q4YzQ2MGJiOTljODBkZjFlYWIzNDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5naXNiZXJ0c2NobGVpY2hAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3MzdmZDBlMTEzYTQ2NGFhZGRhYjM2Y2UxMzc3OWExLnNldENvbnRlbnQoaHRtbF83MDM2N2I0ZmNkOGM0NjBiYjk5YzgwZGYxZWFiMzQzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YWMxMWVlODZiN2U0YTZlODk5MWJhY2ZiZWIxYTc4Ny5iaW5kUG9wdXAocG9wdXBfMzczN2ZkMGUxMTNhNDY0YWFkZGFiMzZjZTEzNzc5YTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWJjN2Q0ZjlkMzg1NGE5Njg1MjNlMmY0OThkMDE1ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY5ODYwNSw4LjQ5NDA5NjQzNTY2MzA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDk5YWRmOWQ4ZDY0MTJmOGNlZGQxOWUzNjJhNzhhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNDYzZTA5NDcyMTM0NDkxODYzYjhjNTBiZWE0ZmVkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTQ2M2UwOTQ3MjEzNDQ5MTg2M2I4YzUwYmVhNGZlZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnl3ZWluaGFnZUBiZWllci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQ5OWFkZjlkOGQ2NDEyZjhjZWRkMTllMzYyYTc4YWMuc2V0Q29udGVudChodG1sX2E0NjNlMDk0NzIxMzQ0OTE4NjNiOGM1MGJlYTRmZWQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ViYzdkNGY5ZDM4NTRhOTY4NTIzZTJmNDk4ZDAxNWYzLmJpbmRQb3B1cChwb3B1cF80NDk5YWRmOWQ4ZDY0MTJmOGNlZGQxOWUzNjJhNzhhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTFkN2ExMWI0MzA0MDQzOTNlMWE3NzQ3OGMzMjljNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxYzk1OTVlOGYyYjRkY2U4YWI3MjU1YTNjMGI4NzEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhOWU0ZDQ5MTQwZjRhN2ViNjJiZjFmNTMyNmJkOTc0ID0gJCgnPGRpdiBpZD0iaHRtbF8yYTllNGQ0OTE0MGY0YTdlYjYyYmYxZjUzMjZiZDk3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZXZlbHluZWxvZWZmbGVyQHBhZXJ0emVsdC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDFjOTU5NWU4ZjJiNGRjZThhYjcyNTVhM2MwYjg3MTIuc2V0Q29udGVudChodG1sXzJhOWU0ZDQ5MTQwZjRhN2ViNjJiZjFmNTMyNmJkOTc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlMWQ3YTExYjQzMDQwNDM5M2UxYTc3NDc4YzMyOWM1LmJpbmRQb3B1cChwb3B1cF80MWM5NTk1ZThmMmI0ZGNlOGFiNzI1NWEzYzBiODcxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NWE5NjRmZDE0MmM0YzFlOWRjNzQ2OTY1ODczNDExMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjczNjMsOC41MTA2MDA4MjQyODYzNTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2EwOTVhZWYxMTI2NDM1MDgzMTE0NzAyMmExNTkwNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGIyNjdmZDNhMzA3NGEyYjk4NjI0OGFkMGM4ZGJmOWMgPSAkKCc8ZGl2IGlkPSJodG1sXzhiMjY3ZmQzYTMwNzRhMmI5ODYyNDhhZDBjOGRiZjljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5mYWJpYW50cnViQGdlcmxhY2guY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYTA5NWFlZjExMjY0MzUwODMxMTQ3MDIyYTE1OTA1Yi5zZXRDb250ZW50KGh0bWxfOGIyNjdmZDNhMzA3NGEyYjk4NjI0OGFkMGM4ZGJmOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODVhOTY0ZmQxNDJjNGMxZTlkYzc0Njk2NTg3MzQxMTIuYmluZFBvcHVwKHBvcHVwXzNhMDk1YWVmMTEyNjQzNTA4MzExNDcwMjJhMTU5MDViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyNzVkOWQ1MDUxNDQ3ZjE4NDNjZDU4ODExN2JkZmM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk1NzI4OCw4LjUwNzM1NjAwMTczOTg2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hY2RlMGQ0MWM3MDk0YjMzYjJlYjYzYmRkOWFjMDJlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNWRlNzQxYzY2YTQ0NGNiYmU1YTk1N2ZlMDNjMjUxNCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTVkZTc0MWM2NmE0NDRjYmJlNWE5NTdmZTAzYzI1MTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJvbG5iYWNoZWRpdGhhQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjZGUwZDQxYzcwOTRiMzNiMmViNjNiZGQ5YWMwMmU1LnNldENvbnRlbnQoaHRtbF9hNWRlNzQxYzY2YTQ0NGNiYmU1YTk1N2ZlMDNjMjUxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Mjc1ZDlkNTA1MTQ0N2YxODQzY2Q1ODgxMTdiZGZjNi5iaW5kUG9wdXAocG9wdXBfYWNkZTBkNDFjNzA5NGIzM2IyZWI2M2JkZDlhYzAyZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzdjYjM2NGY1NmY4NGQ2YThkYmFjZWZlZTNlM2Y2NGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY2MDQxNSw4LjUwODgyNTA0MDE0NzkyOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOTY3Y2FhYjA4OTU0NDFmYTQxMmI1NGZmNTA5NzdlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83M2E2NTFiNDRkMjk0NjA5Yjk5OGU5MjEzMTUxZGUwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzNhNjUxYjQ0ZDI5NDYwOWI5OThlOTIxMzE1MWRlMDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1laXN0ZXJvbGl2ZXJAc2NoZW5rLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDk2N2NhYWIwODk1NDQxZmE0MTJiNTRmZjUwOTc3ZWYuc2V0Q29udGVudChodG1sXzczYTY1MWI0NGQyOTQ2MDliOTk4ZTkyMTMxNTFkZTA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3Y2IzNjRmNTZmODRkNmE4ZGJhY2VmZWUzZTNmNjRmLmJpbmRQb3B1cChwb3B1cF8wOTY3Y2FhYjA4OTU0NDFmYTQxMmI1NGZmNTA5NzdlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZjRkZWQwNDQwOGY0NjRjYmUxMWE2NmQ0YTM5ZmY4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiM2JhZjM5NDE2NDQ1MTg4MmI2OTFjNGYzMmQ2ZDk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlODJlMzE5NmQyYTQwMDk4MzQwN2JlNzkzODllYTUzID0gJCgnPGRpdiBpZD0iaHRtbF83ZTgyZTMxOTZkMmE0MDA5ODM0MDdiZTc5Mzg5ZWE1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2FsYnVyZ2FqYWNvYkBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiM2JhZjM5NDE2NDQ1MTg4MmI2OTFjNGYzMmQ2ZDk4LnNldENvbnRlbnQoaHRtbF83ZTgyZTMxOTZkMmE0MDA5ODM0MDdiZTc5Mzg5ZWE1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjRkZWQwNDQwOGY0NjRjYmUxMWE2NmQ0YTM5ZmY4MC5iaW5kUG9wdXAocG9wdXBfM2IzYmFmMzk0MTY0NDUxODgyYjY5MWM0ZjMyZDZkOTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzFjMGNiN2QyNDgwNDBjNzllZjA0OTU5YTg4YWNiNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTcyOTc2LDguNTA3OTA2MjAzMjE5MTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhMjYyMzRmYmIzNjQ3MGQ5Y2Y3MWZlMDJhNjU0YWQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyY2Y1NjU4OWFlMDQ0ZmE4OWYxMTRlYmU1ZGRkZDllID0gJCgnPGRpdiBpZD0iaHRtbF9iMmNmNTY1ODlhZTA0NGZhODlmMTE0ZWJlNWRkZGQ5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Y3N0ZXlAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYTI2MjM0ZmJiMzY0NzBkOWNmNzFmZTAyYTY1NGFkNi5zZXRDb250ZW50KGh0bWxfYjJjZjU2NTg5YWUwNDRmYTg5ZjExNGViZTVkZGRkOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzFjMGNiN2QyNDgwNDBjNzllZjA0OTU5YTg4YWNiNDEuYmluZFBvcHVwKHBvcHVwX2NhMjYyMzRmYmIzNjQ3MGQ5Y2Y3MWZlMDJhNjU0YWQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1NzQyODFjMmE5ODRjMTU5MzZkNGFlYTdkMmI5YTY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzMzM5NCw4LjUwMjA1MjkwNzk0NjU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NTE5NzgxYzljM2M0MWE2ODYzOWYxNmVkMmUwM2JiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOWE4MGY1NjUxMTg0YjRmYTQ3MjY4NzYxZGQ3YzZhZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzlhODBmNTY1MTE4NGI0ZmE0NzI2ODc2MWRkN2M2YWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndlcm5lcm1hcmtAbWVudHplbC5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1MTk3ODFjOWMzYzQxYTY4NjM5ZjE2ZWQyZTAzYmI5LnNldENvbnRlbnQoaHRtbF8zOWE4MGY1NjUxMTg0YjRmYTQ3MjY4NzYxZGQ3YzZhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNTc0MjgxYzJhOTg0YzE1OTM2ZDRhZWE3ZDJiOWE2NC5iaW5kUG9wdXAocG9wdXBfNDUxOTc4MWM5YzNjNDFhNjg2MzlmMTZlZDJlMDNiYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc1MzgzMjlhMzZjNGNlZGE1OWEzNWFiNWI1MjRmOWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTM0ODk5LDguNDc5MjE2MjM0ODkyMjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxYmFlZGFiNmE4ZDQ5NzFhZDhmYjM0NWRhZThlMzRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjOWUzYjBmYTU1MDQ1ZjRhY2U1MzM5NzBjYzhhMjZhID0gJCgnPGRpdiBpZD0iaHRtbF9iYzllM2IwZmE1NTA0NWY0YWNlNTMzOTcwY2M4YTI2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cmhhcnRtYW5uQHJpbmcubmV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMWJhZWRhYjZhOGQ0OTcxYWQ4ZmIzNDVkYWU4ZTM0Yi5zZXRDb250ZW50KGh0bWxfYmM5ZTNiMGZhNTUwNDVmNGFjZTUzMzk3MGNjOGEyNmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc1MzgzMjlhMzZjNGNlZGE1OWEzNWFiNWI1MjRmOWEuYmluZFBvcHVwKHBvcHVwX2IxYmFlZGFiNmE4ZDQ5NzFhZDhmYjM0NWRhZThlMzRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1NTIzNjI4MzA0NjQ3NmJiOGJjZDE1ODI0YWRmMDA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4MDk0MDUsOC41MDY0MjEwMTgyNzAyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTEwNmE3Yjc4YjU0NGI3N2EyOWZiOTNjMDdiNTE5NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg5YmMyNThlYTdmNGNjYTk1Y2RmOTZkYjYzZTQwOWQgPSAkKCc8ZGl2IGlkPSJodG1sX2E4OWJjMjU4ZWE3ZjRjY2E5NWNkZjk2ZGI2M2U0MDlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5mYmlubmVyQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxMDZhN2I3OGI1NDRiNzdhMjlmYjkzYzA3YjUxOTU1LnNldENvbnRlbnQoaHRtbF9hODliYzI1OGVhN2Y0Y2NhOTVjZGY5NmRiNjNlNDA5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNTUyMzYyODMwNDY0NzZiYjhiY2QxNTgyNGFkZjAwNi5iaW5kUG9wdXAocG9wdXBfOTEwNmE3Yjc4YjU0NGI3N2EyOWZiOTNjMDdiNTE5NTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJhODI5MzdhYWY5NDlhOGExNGNhM2I3MjlmOWE3NTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY1Njk4LDguNDkxODUwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNDIwZjBlOGQ1YWQ0OGRkYTcwZTkzZDM5MDJlY2ZiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZWE0YWQ4ZWMzMjY0YzkwYmI0YmUwM2U5NWMzM2RiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmVhNGFkOGVjMzI2NGM5MGJiNGJlMDNlOTVjMzNkYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNjaHVlbGVycm9uYWxkQG5hc2VyLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTQyMGYwZThkNWFkNDhkZGE3MGU5M2QzOTAyZWNmYjIuc2V0Q29udGVudChodG1sXzZlYTRhZDhlYzMyNjRjOTBiYjRiZTAzZTk1YzMzZGJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyYTgyOTM3YWFmOTQ5YThhMTRjYTNiNzI5ZjlhNzU4LmJpbmRQb3B1cChwb3B1cF9lNDIwZjBlOGQ1YWQ0OGRkYTcwZTkzZDM5MDJlY2ZiMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YzhlYzk4YjA0ODI0N2E5OTIxNTdkNWYyNzk1YjJjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjc4NTE1MDAwMDAwNSw4LjQ4OTk1MTIxMDM0NTM0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MTVmMTEyNTQ2NGY0OGYwYjJlZDUxOGVlMmMyY2U0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYWQ3MDI0NDkzZmI0MzYwOTJlNWNkYjFlYjU2OTkzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGFkNzAyNDQ5M2ZiNDM2MDkyZTVjZGIxZWI1Njk5M2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdpZXJzY2huZXJhbGZyZWRvQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MTVmMTEyNTQ2NGY0OGYwYjJlZDUxOGVlMmMyY2U0OC5zZXRDb250ZW50KGh0bWxfMGFkNzAyNDQ5M2ZiNDM2MDkyZTVjZGIxZWI1Njk5M2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWM4ZWM5OGIwNDgyNDdhOTkyMTU3ZDVmMjc5NWIyY2EuYmluZFBvcHVwKHBvcHVwXzUxNWYxMTI1NDY0ZjQ4ZjBiMmVkNTE4ZWUyYzJjZTQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0ZTA3MzFhYTJkZTQ4NGJhM2YzYTI1MWJlM2I2ZGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2NzI0LDguNDk1NjM0MDYzMjM0NjA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzYTNjNThjOGVjMTQ1YWRiMTY5NTA5Zjk5MmU1M2E1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y3NTFhMjJkMWQ2ZTQ5ODBhMjIzZDJiZDk5ZmRmZTgwID0gJCgnPGRpdiBpZD0iaHRtbF9mNzUxYTIyZDFkNmU0OTgwYTIyM2QyYmQ5OWZkZmU4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aXNhYmVsbGE1M0Bob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kM2EzYzU4YzhlYzE0NWFkYjE2OTUwOWY5OTJlNTNhNS5zZXRDb250ZW50KGh0bWxfZjc1MWEyMmQxZDZlNDk4MGEyMjNkMmJkOTlmZGZlODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRlMDczMWFhMmRlNDg0YmEzZjNhMjUxYmUzYjZkZDAuYmluZFBvcHVwKHBvcHVwX2QzYTNjNThjOGVjMTQ1YWRiMTY5NTA5Zjk5MmU1M2E1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZjNTllMzRhNTZlODQ2NmY5ODVhMTZjYWQ4MmE0NTI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA1NTMzMSw4LjQ5ODI4MDMwODE4MTA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80Nzc1NTZiYjJkODQ0YmE1OGNhNmM2YjI2ZWMzY2ExNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zN2Q1YWJkNGNiMmM0NjRiYjFlN2QxYWM0YWM3NGI2MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzdkNWFiZDRjYjJjNDY0YmIxZTdkMWFjNGFjNzRiNjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhtYW5zQHRyb2VzdC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ3NzU1NmJiMmQ4NDRiYTU4Y2E2YzZiMjZlYzNjYTE3LnNldENvbnRlbnQoaHRtbF8zN2Q1YWJkNGNiMmM0NjRiYjFlN2QxYWM0YWM3NGI2Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YzU5ZTM0YTU2ZTg0NjZmOTg1YTE2Y2FkODJhNDUyNy5iaW5kUG9wdXAocG9wdXBfNDc3NTU2YmIyZDg0NGJhNThjYTZjNmIyNmVjM2NhMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODEwZDZjNGZmYmVlNDkxNDg4ZWFmMTE2ZGE0NDM3OGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM5Nzc0NSw4LjQ5ODMyMDA4MDc2ODcyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MjU0NTFhMzAwOWU0YmE0OGMyZGExZTg1ZGRlZWU2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzMxMzk4MzI4ZTg0YTY0OTI3OGVkNjVjYzY3Zjg0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzczMTM5ODMyOGU4NGE2NDkyNzhlZDY1Y2M2N2Y4NGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdlcmxhY2hnZXJoYXJkdEBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyNTQ1MWEzMDA5ZTRiYTQ4YzJkYTFlODVkZGVlZTY1LnNldENvbnRlbnQoaHRtbF9jNzMxMzk4MzI4ZTg0YTY0OTI3OGVkNjVjYzY3Zjg0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTBkNmM0ZmZiZWU0OTE0ODhlYWYxMTZkYTQ0Mzc4YS5iaW5kUG9wdXAocG9wdXBfNzI1NDUxYTMwMDllNGJhNDhjMmRhMWU4NWRkZWVlNjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzgxMzZiYTcxNzQzNDA4OGEwNmE0MGJiYzA3NmJjOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTEwNDgwNTAwMDAwMDUsOC40ODcwMzA5MTU5ODU3MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODIwNzMyNWRiODc0NGE1NmI3ZDYzYjM2YWYxNWU2MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2I5MDZmMTZjZjFiNDU1ZWI4MmNkZmE0OTc1NWJjZmIgPSAkKCc8ZGl2IGlkPSJodG1sX2NiOTA2ZjE2Y2YxYjQ1NWViODJjZGZhNDk3NTViY2ZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oYXJkeTY4QGJvbHptYW5uLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MjA3MzI1ZGI4NzQ0YTU2YjdkNjNiMzZhZjE1ZTYxZi5zZXRDb250ZW50KGh0bWxfY2I5MDZmMTZjZjFiNDU1ZWI4MmNkZmE0OTc1NWJjZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzgxMzZiYTcxNzQzNDA4OGEwNmE0MGJiYzA3NmJjOGIuYmluZFBvcHVwKHBvcHVwXzgyMDczMjVkYjg3NDRhNTZiN2Q2M2IzNmFmMTVlNjFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4OWJkMTYyZmU1YTQxMWRhMDA5YTcxNjg0ZmIzMGMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MzU2NjUsOC40OTUxNDIzMTk2NzEzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MmY5NWEyMWQyNGU0Y2MyOTNiN2FkMTc0OWQyNmQ2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZjY2OWQwMmVlNWM0N2UyYjZhYTM1YTM3Yzk0MDRlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmY2NjlkMDJlZTVjNDdlMmI2YWEzNWEzN2M5NDA0ZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmh1Z28zM0Bib2xhbmRlci5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyZjk1YTIxZDI0ZTRjYzI5M2I3YWQxNzQ5ZDI2ZDYyLnNldENvbnRlbnQoaHRtbF9mZjY2OWQwMmVlNWM0N2UyYjZhYTM1YTM3Yzk0MDRlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mODliZDE2MmZlNWE0MTFkYTAwOWE3MTY4NGZiMzBjMy5iaW5kUG9wdXAocG9wdXBfNzJmOTVhMjFkMjRlNGNjMjkzYjdhZDE3NDlkMjZkNjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTY2ZTE2NDQyODI1NDk4M2IzN2EyZGY0MmE5NjM4ZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcyNDUyNSw4LjQ5MjMxNjk5MjI5NDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyMzAzNGY2NDViNDRkNTI4NmQ2MzZjNjgzMmE3MzUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNmRkN2Y0NjY2YjQ1ZTNiMmZmZjU5MmFmMzM1YmZjID0gJCgnPGRpdiBpZD0iaHRtbF9iZDZkZDdmNDY2NmI0NWUzYjJmZmY1OTJhZjMzNWJmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bW9lY2hsaWNoZW5sanViaWNhQHdpZWxvY2gub3JnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjMwMzRmNjQ1YjQ0ZDUyODZkNjM2YzY4MzJhNzM1My5zZXRDb250ZW50KGh0bWxfYmQ2ZGQ3ZjQ2NjZiNDVlM2IyZmZmNTkyYWYzMzViZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTY2ZTE2NDQyODI1NDk4M2IzN2EyZGY0MmE5NjM4ZTcuYmluZFBvcHVwKHBvcHVwXzEyMzAzNGY2NDViNDRkNTI4NmQ2MzZjNjgzMmE3MzUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlZDM0MThiY2FmYTRhMjU4ZGUzMTNmMWJhZjcyM2EyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3NDUzNyw4LjQ4ODMyODkyODAxMjA0OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81N2NjNTFkNjFjMjg0ZTNkOGY2ZGRlMGQ5ZmRlYTdiMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDU4NDRkN2I3MjM0YmUxYmE0Zjc4MWRhMTFmODdiOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmQ1ODQ0ZDdiNzIzNGJlMWJhNGY3ODFkYTExZjg3YjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxvdHRpNDZAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81N2NjNTFkNjFjMjg0ZTNkOGY2ZGRlMGQ5ZmRlYTdiMy5zZXRDb250ZW50KGh0bWxfYmQ1ODQ0ZDdiNzIzNGJlMWJhNGY3ODFkYTExZjg3YjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWVkMzQxOGJjYWZhNGEyNThkZTMxM2YxYmFmNzIzYTIuYmluZFBvcHVwKHBvcHVwXzU3Y2M1MWQ2MWMyODRlM2Q4ZjZkZGUwZDlmZGVhN2IzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3NTNmZWRmZGFlOTRmOTVhOTczMjU0MzE5Nzc4M2JlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk1NTcxNzUsOC41MTQyMDk5NTA0MDA4MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzliNjlkYzgzYzJlNDEwMWE1ZjQwNjE3Y2QwMzRkOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmEzN2UzZjRjODkyNGYyMjllYzNlYTc1OTQ1NGM0YzMgPSAkKCc8ZGl2IGlkPSJodG1sXzJhMzdlM2Y0Yzg5MjRmMjI5ZWMzZWE3NTk0NTRjNGMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5za2FidXNAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5YjY5ZGM4M2MyZTQxMDFhNWY0MDYxN2NkMDM0ZDlhLnNldENvbnRlbnQoaHRtbF8yYTM3ZTNmNGM4OTI0ZjIyOWVjM2VhNzU5NDU0YzRjMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NzUzZmVkZmRhZTk0Zjk1YTk3MzI1NDMxOTc3ODNiZS5iaW5kUG9wdXAocG9wdXBfNzliNjlkYzgzYzJlNDEwMWE1ZjQwNjE3Y2QwMzRkOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmNjNDI1NTE0Y2Q3NGIxMWI3MzFkMGYwMDUwY2FlNGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMyNzQ4NSw4LjUwMzg4NTg1MTEyNjU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2YTliOGJhNjM5ZTQ0MDhiZmNhOTFjNDFkMjA2N2Q0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiMzFjNjQ0ZGRmYjQxMDE4NGUwNThlMzkwOWY2ZjA3ID0gJCgnPGRpdiBpZD0iaHRtbF82YjMxYzY0NGRkZmI0MTAxODRlMDU4ZTM5MDlmNmYwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Ym91Y3NlaW5rYXJsLWpvc2VmQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNmE5YjhiYTYzOWU0NDA4YmZjYTkxYzQxZDIwNjdkNC5zZXRDb250ZW50KGh0bWxfNmIzMWM2NDRkZGZiNDEwMTg0ZTA1OGUzOTA5ZjZmMDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmNjNDI1NTE0Y2Q3NGIxMWI3MzFkMGYwMDUwY2FlNGEuYmluZFBvcHVwKHBvcHVwX2U2YTliOGJhNjM5ZTQ0MDhiZmNhOTFjNDFkMjA2N2Q0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyNjk5YjA0YWY1YTRmYTdhMzAyN2I5YWUwMWJmNWZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzNTI3Myw4LjQ5MjUzNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTljMDkxMzdhZjc2NGFiYmJhZjUwNzA2NzZiMjRkYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjJjNGNlYTYxZjg3NGU1MWJhN2IzMDE1M2Y5NzA5NzQgPSAkKCc8ZGl2IGlkPSJodG1sXzIyYzRjZWE2MWY4NzRlNTFiYTdiMzAxNTNmOTcwOTc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5uZXVzY2hhZWZlcmVtaWxAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5YzA5MTM3YWY3NjRhYmJiYWY1MDcwNjc2YjI0ZGM2LnNldENvbnRlbnQoaHRtbF8yMmM0Y2VhNjFmODc0ZTUxYmE3YjMwMTUzZjk3MDk3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMjY5OWIwNGFmNWE0ZmE3YTMwMjdiOWFlMDFiZjVmYi5iaW5kUG9wdXAocG9wdXBfNTljMDkxMzdhZjc2NGFiYmJhZjUwNzA2NzZiMjRkYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTQyZWFjY2Y4MDkwNDRjMWI1N2U4YzE4MDRiODNhMzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTQwNjk0NSw4LjQ4MDM2NjcxOTI0NTEzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMmFkZjIzYWY1NDk0MzBhYjgxNmUwYjJiMmU2MTAzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MzA2MGVlODhlNjg0M2JmYTBlNDA3MjU4OGRhODVhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTMwNjBlZTg4ZTY4NDNiZmEwZTQwNzI1ODhkYTg1YWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNjaG9lbmxhbmRuYXRhbGlhQGhlc2VyLm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzJhZGYyM2FmNTQ5NDMwYWI4MTZlMGIyYjJlNjEwMzguc2V0Q29udGVudChodG1sXzkzMDYwZWU4OGU2ODQzYmZhMGU0MDcyNTg4ZGE4NWFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0MmVhY2NmODA5MDQ0YzFiNTdlOGMxODA0YjgzYTMxLmJpbmRQb3B1cChwb3B1cF9jMmFkZjIzYWY1NDk0MzBhYjgxNmUwYjJiMmU2MTAzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMjY3Zjk2M2I4ZTg0NDczYjhjN2I4ZGIzMDFlNDZhMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMDU2NjksOC40ODM2MjAwNjg4OTU5MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM0MjRkYjljMjEyNGMwZGFjNmIxZTIwMjU1ZWQzNTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGIwNDJjYjhkYmIyNDI3OTk5ZTY2OGFhYmY0YTk5MTggPSAkKCc8ZGl2IGlkPSJodG1sXzRiMDQyY2I4ZGJiMjQyNzk5OWU2NjhhYWJmNGE5OTE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tYXJsaWVzZXdlaXNzQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM0MjRkYjljMjEyNGMwZGFjNmIxZTIwMjU1ZWQzNTcuc2V0Q29udGVudChodG1sXzRiMDQyY2I4ZGJiMjQyNzk5OWU2NjhhYWJmNGE5OTE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyNjdmOTYzYjhlODQ0NzNiOGM3YjhkYjMwMWU0NmEzLmJpbmRQb3B1cChwb3B1cF8wMzQyNGRiOWMyMTI0YzBkYWM2YjFlMjAyNTVlZDM1Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzU1MThjNmFkNmQ0NzgyOTI3ZTU3ZGE5YmZhZmJkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzkzNjksOC40OTI5NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiODhiMTU1MDQ3NzQyNGFhOWYwMjYzNzZmYTE2MWUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3ZWFiNDExNTQzYzRkNTNhYTQ5NTAwM2FlNDQyOTM3ID0gJCgnPGRpdiBpZD0iaHRtbF8wN2VhYjQxMTU0M2M0ZDUzYWE0OTUwMDNhZTQ0MjkzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2FldWJlcmxpY2hoYW5zLXdpbGxpQHJlaW5oYXJkdC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiODhiMTU1MDQ3NzQyNGFhOWYwMjYzNzZmYTE2MWUzLnNldENvbnRlbnQoaHRtbF8wN2VhYjQxMTU0M2M0ZDUzYWE0OTUwMDNhZTQ0MjkzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNzU1MThjNmFkNmQ0NzgyOTI3ZTU3ZGE5YmZhZmJkZS5iaW5kUG9wdXAocG9wdXBfNmI4OGIxNTUwNDc3NDI0YWE5ZjAyNjM3NmZhMTYxZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTM1ODQ2NzQ0ODNjNDJhM2FkODY4ZTYxZmM1OTY3ZDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTM1MTIxLDguNDc4Njg5NzU0ODk3NTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExYzFmN2FhZmVmMDRkOWJhNjU1YWZiM2MxOTY5MTk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiYTRmOGM3YjE2NzQ1YmU4MGZkZjU3M2U5NjhlNzM3ID0gJCgnPGRpdiBpZD0iaHRtbF8yYmE0ZjhjN2IxNjc0NWJlODBmZGY1NzNlOTY4ZTczNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d2lsbXNlbmthcm9sYUBzYWV1YmVybGljaC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExYzFmN2FhZmVmMDRkOWJhNjU1YWZiM2MxOTY5MTk0LnNldENvbnRlbnQoaHRtbF8yYmE0ZjhjN2IxNjc0NWJlODBmZGY1NzNlOTY4ZTczNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMzU4NDY3NDQ4M2M0MmEzYWQ4NjhlNjFmYzU5NjdkMy5iaW5kUG9wdXAocG9wdXBfMTFjMWY3YWFmZWYwNGQ5YmE2NTVhZmIzYzE5NjkxOTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzAyMjIzMjQ0NDg0NGIwNzkxYmY5OWJmYWFhNWNjYTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM0OTI0LDguNDk3MzQ5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OTVhNTYyMzI3MTM0ZDk5YTFkMzYzZmZmNjZiOGE5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MDYzNjVkMGViNDI0NzYwOTY0YTlhNzAxZWU1OTE2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjA2MzY1ZDBlYjQyNDc2MDk2NGE5YTcwMWVlNTkxNmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmlyaXMzOEBiZXllci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDk1YTU2MjMyNzEzNGQ5OWExZDM2M2ZmZjY2YjhhOTIuc2V0Q29udGVudChodG1sXzYwNjM2NWQwZWI0MjQ3NjA5NjRhOWE3MDFlZTU5MTZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcwMjIyMzI0NDQ4NDRiMDc5MWJmOTliZmFhYTVjY2E0LmJpbmRQb3B1cChwb3B1cF80OTVhNTYyMzI3MTM0ZDk5YTFkMzYzZmZmNjZiOGE5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZGUxZWQ4YzIxNWU0NTFjOWNiNDk4NjM4OWEyM2EyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNjYyMyw4LjQ4MTM2MzcyMzAyMzI1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjJlY2U4MWRmYjM0YzM1OGE2NmUzMmFkZWNhOWRmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZThhZGMyMmFjZjM0ZmIzOWZmMmQxMWFjZGJhNDczMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWU4YWRjMjJhY2YzNGZiMzlmZjJkMTFhY2RiYTQ3MzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtyYXVzZWVyZG9nYW5AYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjJlY2U4MWRmYjM0YzM1OGE2NmUzMmFkZWNhOWRmNi5zZXRDb250ZW50KGh0bWxfYWU4YWRjMjJhY2YzNGZiMzlmZjJkMTFhY2RiYTQ3MzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGRlMWVkOGMyMTVlNDUxYzljYjQ5ODYzODlhMjNhMmQuYmluZFBvcHVwKHBvcHVwXzg2MmVjZTgxZGZiMzRjMzU4YTY2ZTMyYWRlY2E5ZGY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxYmI4YjNhYTQwODQ2M2I4MDhjYTZkNWIxY2I3MWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA1NDIwMSw4LjQ5ODY4NTU0MDgyMzY2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWM1MjU4Njg4M2U0N2M3YjUwODYwYzNhZDY0ZmY4YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjM0MmEzNzM1MzQ0YTcxYjM5ZjYyZDhhMjdhYTM2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTIzNDJhMzczNTM0NGE3MWIzOWY2MmQ4YTI3YWEzNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJ1cHBlcnNiZXJnZXJzeWx2aWVAc2NoaW5rZS5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDVjNTI1ODY4ODNlNDdjN2I1MDg2MGMzYWQ2NGZmOGIuc2V0Q29udGVudChodG1sXzkyMzQyYTM3MzUzNDRhNzFiMzlmNjJkOGEyN2FhMzYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxYmI4YjNhYTQwODQ2M2I4MDhjYTZkNWIxY2I3MWQyLmJpbmRQb3B1cChwb3B1cF8wNWM1MjU4Njg4M2U0N2M3YjUwODYwYzNhZDY0ZmY4Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZWUzODUzMzhjMzc0YWQ3YmRiNDRhMmM0NTdlNjk0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5Nzc4OTEsOC41MTE1ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyYTI5YjIyNTZjNzQ4OGNiZGM3OTMzMDk2YWNlODk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhNjY5OGY4YTYxNzQxNDViMjQ5MDAxMTlhM2UxNjFlID0gJCgnPGRpdiBpZD0iaHRtbF9hYTY2OThmOGE2MTc0MTQ1YjI0OTAwMTE5YTNlMTYxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2NoZWVscm9zZWxpbmRlQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTJhMjliMjI1NmM3NDg4Y2JkYzc5MzMwOTZhY2U4OTkuc2V0Q29udGVudChodG1sX2FhNjY5OGY4YTYxNzQxNDViMjQ5MDAxMTlhM2UxNjFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VlZTM4NTMzOGMzNzRhZDdiZGI0NGEyYzQ1N2U2OTQ5LmJpbmRQb3B1cChwb3B1cF9hMmEyOWIyMjU2Yzc0ODhjYmRjNzkzMzA5NmFjZTg5OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xODVjNzM1NmY5ZWQ0YmI2YTdmNGM3MTkwMDc0ZGIxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDY3MDQsOC41MDc3ODk5NTIzOTQ0NTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDEzMmI2ZDUzYTVlNGQ3NGJhMGExYjcyZGY4ZDk0ZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzljMWIwMGVmNjIzNGRhYmFmMzg1YjZhYTUyZDQ1NmYgPSAkKCc8ZGl2IGlkPSJodG1sX2M5YzFiMDBlZjYyMzRkYWJhZjM4NWI2YWE1MmQ0NTZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ndWVudGVyZ290dGhhcmRAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTMyYjZkNTNhNWU0ZDc0YmEwYTFiNzJkZjhkOTRlNS5zZXRDb250ZW50KGh0bWxfYzljMWIwMGVmNjIzNGRhYmFmMzg1YjZhYTUyZDQ1NmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTg1YzczNTZmOWVkNGJiNmE3ZjRjNzE5MDA3NGRiMWQuYmluZFBvcHVwKHBvcHVwXzAxMzJiNmQ1M2E1ZTRkNzRiYTBhMWI3MmRmOGQ5NGU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiNzFhNDc1OTk1ZjQyMzBiNDFhOThmYzAzMjBmNjFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTc3NDUsOC40OTgzMjAwODA3Njg3MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTZkYTU2ZDg4MDA3NDQyMDk5ZGJlZTY3MGU2ZDJkMmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzNlY2U1YmU1MGE5NGE1Mzk2ZjUwYWI4ZjZkMmU5NGMgPSAkKCc8ZGl2IGlkPSJodG1sX2MzZWNlNWJlNTBhOTRhNTM5NmY1MGFiOGY2ZDJlOTRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hbmdlbGljYWJsb2NoQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTZkYTU2ZDg4MDA3NDQyMDk5ZGJlZTY3MGU2ZDJkMmQuc2V0Q29udGVudChodG1sX2MzZWNlNWJlNTBhOTRhNTM5NmY1MGFiOGY2ZDJlOTRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiNzFhNDc1OTk1ZjQyMzBiNDFhOThmYzAzMjBmNjFlLmJpbmRQb3B1cChwb3B1cF8xNmRhNTZkODgwMDc0NDIwOTlkYmVlNjcwZTZkMmQyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OTQzZDdhOTg4ZTQ0MGE4OTI3ZmQyYmU2ZDIxNDQ2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMTU5MjI5OTk5OTk5NSw4LjQ4NTU3ODcyNjQzNzY2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzMzYzcwYWEwZWI0NDcyYjE4YWEwNDQ3YTNiOGZlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNDZhMTc1YjEyODY0OWY5OGEwMGQ0OGY3ZGUzNDdjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTQ2YTE3NWIxMjg2NDlmOThhMDBkNDhmN2RlMzQ3YzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnhzY2h1ZWxlckB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3MzNjNzBhYTBlYjQ0NzJiMThhYTA0NDdhM2I4ZmU0LnNldENvbnRlbnQoaHRtbF9hNDZhMTc1YjEyODY0OWY5OGEwMGQ0OGY3ZGUzNDdjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTQzZDdhOTg4ZTQ0MGE4OTI3ZmQyYmU2ZDIxNDQ2My5iaW5kUG9wdXAocG9wdXBfZjczM2M3MGFhMGViNDQ3MmIxOGFhMDQ0N2EzYjhmZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY2OTZkNTVmMzJiNDkwOGIwNmU2ZTc4YjE0ZTRhMGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcwNTQ1NSw4LjQ3OTU1Mjc2NTQyOTEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZWM0Yzg1Yzc1MTE0NGUwYjFkMmMzNzA1MzEwMDU3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjU4ZTUwNjYwYmU0ZGQwYmY4MjNmM2M0OGQzNDliYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzY1OGU1MDY2MGJlNGRkMGJmODIzZjNjNDhkMzQ5YmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndpcnRoaGVucnlrQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZWM0Yzg1Yzc1MTE0NGUwYjFkMmMzNzA1MzEwMDU3MC5zZXRDb250ZW50KGh0bWxfMzY1OGU1MDY2MGJlNGRkMGJmODIzZjNjNDhkMzQ5YmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWY2OTZkNTVmMzJiNDkwOGIwNmU2ZTc4YjE0ZTRhMGUuYmluZFBvcHVwKHBvcHVwXzhlYzRjODVjNzUxMTQ0ZTBiMWQyYzM3MDUzMTAwNTcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzMWYyNzBiZjIyYjQ0MzFiZGJmNjIyZDdhZjJiZDc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAxMDY3OTk5OTk5OTk1LDguNDk4NjYwOTAwMDU4NDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkYjk1OGMyMmRiYzQxZjRiMjIzZWE5YzA5YmI3ZTc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MGRmMDcyZjZjMjQ2MTI4MWYyYmE0Nzc5NWYxZTI1ID0gJCgnPGRpdiBpZD0iaHRtbF82OTBkZjA3MmY2YzI0NjEyODFmMmJhNDc3OTVmMWUyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2VsbWFhdXN0ZXJtdWVobGVAZ29vZ2xlbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkYjk1OGMyMmRiYzQxZjRiMjIzZWE5YzA5YmI3ZTc1LnNldENvbnRlbnQoaHRtbF82OTBkZjA3MmY2YzI0NjEyODFmMmJhNDc3OTVmMWUyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzFmMjcwYmYyMmI0NDMxYmRiZjYyMmQ3YWYyYmQ3Ny5iaW5kUG9wdXAocG9wdXBfM2RiOTU4YzIyZGJjNDFmNGIyMjNlYTljMDliYjdlNzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDgxYmQ2NDhlMDBlNGFlOWIwYTJiNTdhOTIzNzdmOWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTYwODE0LDguNTA2MTQ2MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MDU2ZjVhMmE1ZmY0NzZlYjg2ODA1NjEzYTI1OWE2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZjE4Mjg2MDkzMjM0NWQwOTE0MTI4ZTU4ZGQzMDVlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWYxODI4NjA5MzIzNDVkMDkxNDEyOGU1OGRkMzA1ZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJ1cHBlcnRjb25zdGFuY2VAYmFydGgub3JnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDU2ZjVhMmE1ZmY0NzZlYjg2ODA1NjEzYTI1OWE2NC5zZXRDb250ZW50KGh0bWxfMWYxODI4NjA5MzIzNDVkMDkxNDEyOGU1OGRkMzA1ZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDgxYmQ2NDhlMDBlNGFlOWIwYTJiNTdhOTIzNzdmOWQuYmluZFBvcHVwKHBvcHVwXzQwNTZmNWEyYTVmZjQ3NmViODY4MDU2MTNhMjU5YTY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiZjdmZmNlNzgyZDQ4Nzg4YzEyNTViYmFjMGFjNzRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MDU0NTUsOC40Nzk1NTI3NjU0MjkxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDI5MTMxNjVlNTA2NDQ1ODkxMDliZDA1ZDhlZmMyY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDc3YjEwNDM3MmUzNDFkNjlkYTJiZTE5ZDQxNTRjMmUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ3N2IxMDQzNzJlMzQxZDY5ZGEyYmUxOWQ0MTU0YzJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5mbGFudHplbWluZUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyOTEzMTY1ZTUwNjQ0NTg5MTA5YmQwNWQ4ZWZjMmNhLnNldENvbnRlbnQoaHRtbF80NzdiMTA0MzcyZTM0MWQ2OWRhMmJlMTlkNDE1NGMyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYmY3ZmZjZTc4MmQ0ODc4OGMxMjU1YmJhYzBhYzc0ZS5iaW5kUG9wdXAocG9wdXBfMDI5MTMxNjVlNTA2NDQ1ODkxMDliZDA1ZDhlZmMyY2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmRlZThjNzI1YjllNDZmMmI1YjMzY2UwOTdlOTE0ZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTkxNzIxLDguNDk3ODQ1MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGJmOTQxMDkwOTE4NGM3NTg2MzlmMTNjMjdjOTY5NGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2RlNWIwMDA4ZmQxNDg4ZjkyYzFhYzFhODQ2YTAxYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzNkZTViMDAwOGZkMTQ4OGY5MmMxYWMxYTg0NmEwMWE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ob2ZmbWFubmNlbnRhQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJmOTQxMDkwOTE4NGM3NTg2MzlmMTNjMjdjOTY5NGIuc2V0Q29udGVudChodG1sXzNkZTViMDAwOGZkMTQ4OGY5MmMxYWMxYTg0NmEwMWE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJkZWU4YzcyNWI5ZTQ2ZjJiNWIzM2NlMDk3ZTkxNGRiLmJpbmRQb3B1cChwb3B1cF8wYmY5NDEwOTA5MTg0Yzc1ODYzOWYxM2MyN2M5Njk0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjlkY2RiYWMxNTU0YmVhYWUwNjk5N2FlYjkyNDg4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzIxMzg1LDguNDk0Mjk2NDAwNDYyNzQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwYzczOTkwM2YzYzQyZWNhNmFmZTZhMGI3NTlmZjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcyMDk1ZGZkZGE0NTQ1MDdiNmI0YTFhNjA5MmY3NjcwID0gJCgnPGRpdiBpZD0iaHRtbF83MjA5NWRmZGRhNDU0NTA3YjZiNGExYTYwOTJmNzY3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Y29yZDk4QGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGM3Mzk5MDNmM2M0MmVjYTZhZmU2YTBiNzU5ZmYyMS5zZXRDb250ZW50KGh0bWxfNzIwOTVkZmRkYTQ1NDUwN2I2YjRhMWE2MDkyZjc2NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjI5ZGNkYmFjMTU1NGJlYWFlMDY5OTdhZWI5MjQ4ODkuYmluZFBvcHVwKHBvcHVwXzAwYzczOTkwM2YzYzQyZWNhNmFmZTZhMGI3NTlmZjIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4OWRjYWQyZjQyNzQ4YzQ4MDJkMzVlY2ViMmVlM2RiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3NTEwNCw4LjQ4NTkzMTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjM0MDNhNDM2MmE4NDBkYTgzM2U5ZDVkNTc1Mjk2N2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDRjNGVlMGYyZWRkNGRhOWI1MDcyYmM3YTBiZDRkNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzQ0YzRlZTBmMmVkZDRkYTliNTA3MmJjN2EwYmQ0ZDcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5kZW5ueTQ4QGhlbGx3aWcuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzNDAzYTQzNjJhODQwZGE4MzNlOWQ1ZDU3NTI5NjdiLnNldENvbnRlbnQoaHRtbF80NGM0ZWUwZjJlZGQ0ZGE5YjUwNzJiYzdhMGJkNGQ3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODlkY2FkMmY0Mjc0OGM0ODAyZDM1ZWNlYjJlZTNkYi5iaW5kUG9wdXAocG9wdXBfMjM0MDNhNDM2MmE4NDBkYTgzM2U5ZDVkNTc1Mjk2N2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmE0YmY0ODE1YjQxNDhmMTlmZWU1ZGUxZjZjNmRmM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTk1Nzk2LDguNTAzNDU2NTc4MTMzNjMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjMjhmOGJhYjhhNTQ0NjJhMDM1MTUxNjQ5M2QyYWU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0ZTEwZjAzNGQ2MzRiYmRiODdlNWYzZWI3NWQ1Y2ViID0gJCgnPGRpdiBpZD0iaHRtbF9jNGUxMGYwMzRkNjM0YmJkYjg3ZTVmM2ViNzVkNWNlYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+amFubmE3N0BnaWVzcy5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMyOGY4YmFiOGE1NDQ2MmEwMzUxNTE2NDkzZDJhZTUuc2V0Q29udGVudChodG1sX2M0ZTEwZjAzNGQ2MzRiYmRiODdlNWYzZWI3NWQ1Y2ViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhNGJmNDgxNWI0MTQ4ZjE5ZmVlNWRlMWY2YzZkZjNlLmJpbmRQb3B1cChwb3B1cF9lYzI4ZjhiYWI4YTU0NDYyYTAzNTE1MTY0OTNkMmFlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MTk0NTRiZjVhY2Y0MWYyYWFjZWE1OWFhZTMzMTAyOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNjQ2OTMsOC40ODIzMjIyNDgyODc0MDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWQ4Nzc0ZWFjNzQ3NGE0OWExYzcyMGRmMDhkZjMyZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTAwYmI1NzlmYTdmNDdkNmIxMmYwMWU2ZTc3ZWVhYWUgPSAkKCc8ZGl2IGlkPSJodG1sXzUwMGJiNTc5ZmE3ZjQ3ZDZiMTJmMDFlNmU3N2VlYWFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5uYXNlcmRhZ29iZXJ0QHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZDg3NzRlYWM3NDc0YTQ5YTFjNzIwZGYwOGRmMzJkZS5zZXRDb250ZW50KGh0bWxfNTAwYmI1NzlmYTdmNDdkNmIxMmYwMWU2ZTc3ZWVhYWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODE5NDU0YmY1YWNmNDFmMmFhY2VhNTlhYWUzMzEwMjkuYmluZFBvcHVwKHBvcHVwXzVkODc3NGVhYzc0NzRhNDlhMWM3MjBkZjA4ZGYzMmRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2NTIzMzY1NWM3NzQwZDBiOWVjNTJhMDg0NDQ2MWJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzNTI3Myw4LjQ5MjUzNzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg2YTBhMTE2YzZjNGRkZDljYzgwNDdhOTY0YzA0ZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQ4NGYzMjRjMTY3NGFhZTkzNjNhYjViM2MyNGFmZmEgPSAkKCc8ZGl2IGlkPSJodG1sX2JkODRmMzI0YzE2NzRhYWU5MzYzYWI1YjNjMjRhZmZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5haG1hZGRpcHBlbEBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4NmEwYTExNmM2YzRkZGQ5Y2M4MDQ3YTk2NGMwNGRhLnNldENvbnRlbnQoaHRtbF9iZDg0ZjMyNGMxNjc0YWFlOTM2M2FiNWIzYzI0YWZmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NjUyMzM2NTVjNzc0MGQwYjllYzUyYTA4NDQ0NjFiZS5iaW5kUG9wdXAocG9wdXBfYzg2YTBhMTE2YzZjNGRkZDljYzgwNDdhOTY0YzA0ZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmZhNDY2M2MwMWZiNGE3N2FmNzA0YjcwODYxZTc5YmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTcyMzk3LDguNTAyOTk4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDBhMzlkZTdlYjg0ZTcwODZkNDc2Y2Y5M2I5MDk2MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NGU1MTliZDIwM2I0NGVlYTFlOTBkYzhhMjQ0Mzc3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzRlNTE5YmQyMDNiNDRlZWExZTkwZGM4YTI0NDM3N2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNocmlzdG9waGVyODZAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDBhMzlkZTdlYjg0ZTcwODZkNDc2Y2Y5M2I5MDk2My5zZXRDb250ZW50KGh0bWxfNzRlNTE5YmQyMDNiNDRlZWExZTkwZGM4YTI0NDM3N2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmZhNDY2M2MwMWZiNGE3N2FmNzA0YjcwODYxZTc5YmEuYmluZFBvcHVwKHBvcHVwXzMwMGEzOWRlN2ViODRlNzA4NmQ0NzZjZjkzYjkwOTYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2YWQ0MmY0ZGI5YzQwMzNhY2FjZWQ2NjUwOGE5NTJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzMDQ4NjUsOC40NzgwMjc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiZTZiMmYzOTQzNTQwMWVhNDk0Njc0NDljMTE5YzNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxMGVmMDMzOWMzMjQ2YzI5YTM4NTViNWZkMWFiMTdkID0gJCgnPGRpdiBpZD0iaHRtbF9jMTBlZjAzMzljMzI0NmMyOWEzODU1YjVmZDFhYjE3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cm9zYS1tYXJpYXNjaG1pZHRAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYmU2YjJmMzk0MzU0MDFlYTQ5NDY3NDQ5YzExOWMzYy5zZXRDb250ZW50KGh0bWxfYzEwZWYwMzM5YzMyNDZjMjlhMzg1NWI1ZmQxYWIxN2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzZhZDQyZjRkYjljNDAzM2FjYWNlZDY2NTA4YTk1MmEuYmluZFBvcHVwKHBvcHVwX2JiZTZiMmYzOTQzNTQwMWVhNDk0Njc0NDljMTE5YzNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjNzkyZjJkMTljMzQ4OTg5MDUwZjVmYTA4ZGUzY2RlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE1MDkyMzUsOC40Nzg2OTc2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZmZhYmYwNjdlZGU0YjNhYTk2MzI3OGE3MDg1YWU2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NzQwNGYxOWJlMWU0NTk1OTdlMWZmYzRiNzlkOGYyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDc0MDRmMTliZTFlNDU5NTk3ZTFmZmM0Yjc5ZDhmMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhvcnN0YnJ1ZGVyQGhhbWFubi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2ZmYWJmMDY3ZWRlNGIzYWE5NjMyNzhhNzA4NWFlNjYuc2V0Q29udGVudChodG1sXzQ3NDA0ZjE5YmUxZTQ1OTU5N2UxZmZjNGI3OWQ4ZjJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjNzkyZjJkMTljMzQ4OTg5MDUwZjVmYTA4ZGUzY2RlLmJpbmRQb3B1cChwb3B1cF8zZmZhYmYwNjdlZGU0YjNhYTk2MzI3OGE3MDg1YWU2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MjE4ZGU1NDA1MzI0NzJhYmI5Y2ZlM2MxMDNlMzdkYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjIzNjEsOC40OTUwMTYyNDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2NiNmY3Y2YzMjMzNDZlMWJjYmVlMjg3YWQzYjA0OWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWM3M2EzZTcxNTJlNGY1ZjgwNTk5M2EyMDUwMTc5MjkgPSAkKCc8ZGl2IGlkPSJodG1sX2FjNzNhM2U3MTUyZTRmNWY4MDU5OTNhMjA1MDE3OTI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yb2VycmljaHRtYXJpYUBnbXguZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjYjZmN2NmMzIzMzQ2ZTFiY2JlZTI4N2FkM2IwNDljLnNldENvbnRlbnQoaHRtbF9hYzczYTNlNzE1MmU0ZjVmODA1OTkzYTIwNTAxNzkyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjE4ZGU1NDA1MzI0NzJhYmI5Y2ZlM2MxMDNlMzdkYi5iaW5kUG9wdXAocG9wdXBfM2NiNmY3Y2YzMjMzNDZlMWJjYmVlMjg3YWQzYjA0OWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDJmYzBhY2FkYWFlNDU3OTgyOTVlNjI3ZGZjNGQ5ZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg2ODc0LDguNTAyOTcwNDQxOTUxNjMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5Y2I0ZjhkNjg4ZjQyYmRhMGFiODM2NjMzYjhjY2ZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxYWU1MjY3Yjc1YjQxMjNiMzMwNDJlNWI0MmQ5ZmJiID0gJCgnPGRpdiBpZD0iaHRtbF8yMWFlNTI2N2I3NWI0MTIzYjMzMDQyZTViNDJkOWZiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bGlzZWxvdHRlMjlAcml0dGVyLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDljYjRmOGQ2ODhmNDJiZGEwYWI4MzY2MzNiOGNjZmIuc2V0Q29udGVudChodG1sXzIxYWU1MjY3Yjc1YjQxMjNiMzMwNDJlNWI0MmQ5ZmJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQyZmMwYWNhZGFhZTQ1Nzk4Mjk1ZTYyN2RmYzRkOWQwLmJpbmRQb3B1cChwb3B1cF80OWNiNGY4ZDY4OGY0MmJkYTBhYjgzNjYzM2I4Y2NmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGI5NDVkOWMyM2M0Y2Y5OGJmMDVjOTU2MGQ3NzJjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDAwMjQsOC41MDgxNjE5MjM4ODQ0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY0MGVlY2Q2NjE4NDkxNmFiMGRhY2FmNzNiOWNmOTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTA0M2JkMWUyM2MzNGFlZDk1YTg3M2RmNjQ0MDc2YmEgPSAkKCc8ZGl2IGlkPSJodG1sXzEwNDNiZDFlMjNjMzRhZWQ5NWE4NzNkZjY0NDA3NmJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5idXJja2hhcmRwbGF0aEBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjQwZWVjZDY2MTg0OTE2YWIwZGFjYWY3M2I5Y2Y5NS5zZXRDb250ZW50KGh0bWxfMTA0M2JkMWUyM2MzNGFlZDk1YTg3M2RmNjQ0MDc2YmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTRiOTQ1ZDljMjNjNGNmOThiZjA1Yzk1NjBkNzcyY2MuYmluZFBvcHVwKHBvcHVwXzg2NDBlZWNkNjYxODQ5MTZhYjBkYWNhZjczYjljZjk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5ZDllYjVlODAyNTRiODVhZTkxMjVjZTMzZWE2NDBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEyMjE3NCw4LjQ4MTcxNDQ5MTAxODc3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNWY0NDhhZGQ5NjU0ODRhYmVkMWQ5OGIxNjJkYjA2YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZGFiZGMwNTYzNjc0MTA3OTNkMDlkMGIwNmJhYTkyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmRhYmRjMDU2MzY3NDEwNzkzZDA5ZDBiMDZiYWE5MjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmtsZW1lbnMxMEBtYW5nb2xkLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNWY0NDhhZGQ5NjU0ODRhYmVkMWQ5OGIxNjJkYjA2Yi5zZXRDb250ZW50KGh0bWxfNmRhYmRjMDU2MzY3NDEwNzkzZDA5ZDBiMDZiYWE5MjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjlkOWViNWU4MDI1NGI4NWFlOTEyNWNlMzNlYTY0MGMuYmluZFBvcHVwKHBvcHVwXzM1ZjQ0OGFkZDk2NTQ4NGFiZWQxZDk4YjE2MmRiMDZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwNWM1YzcyYzMyYzRlZmNiNjczMzRhOGViMGNiZmQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA4NDY2LDguNDg0MzcxODk4MDIwMjIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlMDA5ZTZhMWQ0ZTRlM2U5NWMzZDNhNmZkZDU3ZDQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4YzdhN2RkMWI3ODQ3ZDg5MzkyZTRmZDRmYjZmMzAwID0gJCgnPGRpdiBpZD0iaHRtbF83OGM3YTdkZDFiNzg0N2Q4OTM5MmU0ZmQ0ZmI2ZjMwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWRlbGJlcnRzb250YWdAdGFlc2NoZS5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlMDA5ZTZhMWQ0ZTRlM2U5NWMzZDNhNmZkZDU3ZDQ3LnNldENvbnRlbnQoaHRtbF83OGM3YTdkZDFiNzg0N2Q4OTM5MmU0ZmQ0ZmI2ZjMwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMDVjNWM3MmMzMmM0ZWZjYjY3MzM0YThlYjBjYmZkNy5iaW5kUG9wdXAocG9wdXBfOGUwMDllNmExZDRlNGUzZTk1YzNkM2E2ZmRkNTdkNDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDAzMGFlMzVhNmRiNDE3NzlmNzk2Y2Q0NzFmOTQxNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg3NDg0OTk5OTk5OTYsOC41MTAwMjMwNzU3MjI3ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGZhY2E3Y2U1MGJkNDI2NmEwZTllODc1ZWJmYTRlOTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjViNmE4ODE0ZmYyNGM3YTliYjJmOWFhZGQ2N2FhZWYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y1YjZhODgxNGZmMjRjN2E5YmIyZjlhYWRkNjdhYWVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ib2RvMTRAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmYWNhN2NlNTBiZDQyNjZhMGU5ZTg3NWViZmE0ZTk1LnNldENvbnRlbnQoaHRtbF9mNWI2YTg4MTRmZjI0YzdhOWJiMmY5YWFkZDY3YWFlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMDMwYWUzNWE2ZGI0MTc3OWY3OTZjZDQ3MWY5NDE0MS5iaW5kUG9wdXAocG9wdXBfOGZhY2E3Y2U1MGJkNDI2NmEwZTllODc1ZWJmYTRlOTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjY5ZDE2NjdiZmM5NDk3M2JkNjY3OTcyOGMwNmJiOWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDUzMTQzNSw4LjQ5MjEwNDQxOTUzNTQ4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDlhNDJhMjFkMWQ0YjgzODdmZGNlNGUxZjMzZDBiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZjZhZTkwMmU1MGI0ZWJlOWEyMzcwOWY0NGI0NjcwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Y2YWU5MDJlNTBiNGViZTlhMjM3MDlmNDRiNDY3MGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNjaG1pZHRnaW5vQHJvZW1lci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmQ5YTQyYTIxZDFkNGI4Mzg3ZmRjZTRlMWYzM2QwYmQuc2V0Q29udGVudChodG1sXzdmNmFlOTAyZTUwYjRlYmU5YTIzNzA5ZjQ0YjQ2NzBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2OWQxNjY3YmZjOTQ5NzNiZDY2Nzk3MjhjMDZiYjllLmJpbmRQb3B1cChwb3B1cF82ZDlhNDJhMjFkMWQ0YjgzODdmZGNlNGUxZjMzZDBiZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDU4MzdmNTQ0ZDk0NWU1OGRjNDE0ODE0YWFmZGVlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjQ5MTQsOC40ODUzNzkxNTQyMjIyNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTU3MGRjNjhkMzk3NGNjM2E1N2EzYmQwNmJiNzhjODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNhZWZmZjYxYjVkNDdlMTg4ZmZiYTQ2YjE1OWIzMzIgPSAkKCc8ZGl2IGlkPSJodG1sXzRjYWVmZmY2MWI1ZDQ3ZTE4OGZmYmE0NmIxNTliMzMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5pc2FiZWxsanVua0B3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU1NzBkYzY4ZDM5NzRjYzNhNTdhM2JkMDZiYjc4YzgxLnNldENvbnRlbnQoaHRtbF80Y2FlZmZmNjFiNWQ0N2UxODhmZmJhNDZiMTU5YjMzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDU4MzdmNTQ0ZDk0NWU1OGRjNDE0ODE0YWFmZGVlOC5iaW5kUG9wdXAocG9wdXBfNTU3MGRjNjhkMzk3NGNjM2E1N2EzYmQwNmJiNzhjODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTIxZDY2OWJlZDg1NGQ1NWFlZDU1NWM4MTRiYWI3MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMwNTg2LDguNTAxOTIxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZTBmZDEwYWZlNTU0NDdiYTc2ZWZlZDRhZDM3MmY0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODk4OGE0MzM3ODE0MjIxYTlkODcxNWMyNTcyYmFmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg5ODhhNDMzNzgxNDIyMWE5ZDg3MTVjMjU3MmJhZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndlaXR6ZWxkYW5pZWxhQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlMGZkMTBhZmU1NTQ0N2JhNzZlZmVkNGFkMzcyZjQ4LnNldENvbnRlbnQoaHRtbF81ODk4OGE0MzM3ODE0MjIxYTlkODcxNWMyNTcyYmFmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjFkNjY5YmVkODU0ZDU1YWVkNTU1YzgxNGJhYjcyYS5iaW5kUG9wdXAocG9wdXBfM2UwZmQxMGFmZTU1NDQ3YmE3NmVmZWQ0YWQzNzJmNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDMyYWU4ZGYwMWI1NDY3OTkwNjhlNWUxYjRkZTk1MWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIxNzE3MTU0Nzc0ODYsOC40OTU5OTcyNDY2NDgzMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E4MjA3ZGEzMWYwZTQxNWFhN2ZmZmNiNTA3M2VjZWYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwNGEyOTAxMDQ1YjRkYjliNDJhMDdmODk3YWYxMjNiID0gJCgnPGRpdiBpZD0iaHRtbF85MDRhMjkwMTA0NWI0ZGI5YjQyYTA3Zjg5N2FmMTIzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2ViYWItSGF1cyBIw7ZuZ2c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4MjA3ZGEzMWYwZTQxNWFhN2ZmZmNiNTA3M2VjZWYwLnNldENvbnRlbnQoaHRtbF85MDRhMjkwMTA0NWI0ZGI5YjQyYTA3Zjg5N2FmMTIzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMzJhZThkZjAxYjU0Njc5OTA2OGU1ZTFiNGRlOTUxYi5iaW5kUG9wdXAocG9wdXBfYTgyMDdkYTMxZjBlNDE1YWE3ZmZmY2I1MDczZWNlZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGRiOWY3ZDUzNzIxNGIwOWFiYTc5NmVjYTBkYWNkZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIwODI4OTM2ODkyNzYsOC40OTY5MDM0MTY5MDA1NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmNzkwODkwOTQ3OTRiZjc4ZjU5MWE1YTQ2MGEwM2M2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljODQ3OTQ2NDBjYzQ0ZjliZTkyODhiYWM1N2FkOGU4ID0gJCgnPGRpdiBpZD0iaHRtbF85Yzg0Nzk0NjQwY2M0NGY5YmU5Mjg4YmFjNTdhZDhlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVzcGVyYWRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Zjc5MDg5MDk0Nzk0YmY3OGY1OTFhNWE0NjBhMDNjNi5zZXRDb250ZW50KGh0bWxfOWM4NDc5NDY0MGNjNDRmOWJlOTI4OGJhYzU3YWQ4ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGRiOWY3ZDUzNzIxNGIwOWFiYTc5NmVjYTBkYWNkZTEuYmluZFBvcHVwKHBvcHVwXzZmNzkwODkwOTQ3OTRiZjc4ZjU5MWE1YTQ2MGEwM2M2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiNmRkYzc4NTY0YjRiMDk5OThmNmRhMGQ2NzcyMTYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTM1MzU4OTc3NDQsOC40OTY1MjQxNzQ3NTA4MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2ZTA4YmFmYjFhZTRhNDFhZWYwNDJjNzY3NGEyZTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwMjZiNzUwNjBiODRiMDhhN2M4MDM4NjhlYjE5YTA1ID0gJCgnPGRpdiBpZD0iaHRtbF81MDI2Yjc1MDYwYjg0YjA4YTdjODAzODY4ZWIxOWEwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJnZW50aW5hIFN0ZWFraG91c2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2ZTA4YmFmYjFhZTRhNDFhZWYwNDJjNzY3NGEyZTliLnNldENvbnRlbnQoaHRtbF81MDI2Yjc1MDYwYjg0YjA4YTdjODAzODY4ZWIxOWEwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYjZkZGM3ODU2NGI0YjA5OTk4ZjZkYTBkNjc3MjE2Mi5iaW5kUG9wdXAocG9wdXBfMDZlMDhiYWZiMWFlNGE0MWFlZjA0MmM3Njc0YTJlOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTU2ZmJjYTZjOTg2NDI1MmI5MThiM2VlOTQ4YzExMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIyNjQzNzg0MTc0NSw4LjQ5NTU1NzYwOTUxNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA1MzBmYWJhZWRlNzQwNDE5ODNkOWQ2MjA4N2I0N2VjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3MmUyNDFjZTExNDRmMWM5ODVmODhlZjk3MzE4OWM5ID0gJCgnPGRpdiBpZD0iaHRtbF9hNzJlMjQxY2UxMTQ0ZjFjOTg1Zjg4ZWY5NzMxODljOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3N0ZXJpYSBkYSBCaWFnaW88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1MzBmYWJhZWRlNzQwNDE5ODNkOWQ2MjA4N2I0N2VjLnNldENvbnRlbnQoaHRtbF9hNzJlMjQxY2UxMTQ0ZjFjOTg1Zjg4ZWY5NzMxODljOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTZmYmNhNmM5ODY0MjUyYjkxOGIzZWU5NDhjMTEyZC5iaW5kUG9wdXAocG9wdXBfMDUzMGZhYmFlZGU3NDA0MTk4M2Q5ZDYyMDg3YjQ3ZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjhmZTJlMmEyNDNjNDQwYmFjNjBiMDc2ODc3ZDAxMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDE2NzIyMzE4ODQ4NzQsOC40OTkxMjEzMDE1ODk4OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhZDg1YmY4ZTc0NDQ2YTdhZWE2YWYxZTg3ZmVkZWU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMyZWYyYTQ5M2FmNDQ1MDc5ZmU1MGIxYTIzY2Q0N2U5ID0gJCgnPGRpdiBpZD0iaHRtbF8zMmVmMmE0OTNhZjQ0NTA3OWZlNTBiMWEyM2NkNDdlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGl6emVyaWEgUmFwaWRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWQ4NWJmOGU3NDQ0NmE3YWVhNmFmMWU4N2ZlZGVlOC5zZXRDb250ZW50KGh0bWxfMzJlZjJhNDkzYWY0NDUwNzlmZTUwYjFhMjNjZDQ3ZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjhmZTJlMmEyNDNjNDQwYmFjNjBiMDc2ODc3ZDAxMGYuYmluZFBvcHVwKHBvcHVwXzBhZDg1YmY4ZTc0NDQ2YTdhZWE2YWYxZTg3ZmVkZWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhMmU0ZmUzODRkOTQ3YWNhYTQ3MjJmNGNhNzg3YmE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzMDAwODQ0OTY5NDEsOC40OTgyMDYwMTEzMDAyNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1Mzg3NTdhMGI0MTQ5OGI5YmQ1OGZhNTNkMWVhZmNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiZDMwZDg5MzJkMjQ0YWViM2JjYjIzNjMwMDNkMTUzID0gJCgnPGRpdiBpZD0iaHRtbF9jYmQzMGQ4OTMyZDI0NGFlYjNiY2IyMzYzMDAzZDE1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyY2VsbG8mIzM5O3MgQmlzdHJvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTM4NzU3YTBiNDE0OThiOWJkNThmYTUzZDFlYWZjZi5zZXRDb250ZW50KGh0bWxfY2JkMzBkODkzMmQyNDRhZWIzYmNiMjM2MzAwM2QxNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2EyZTRmZTM4NGQ5NDdhY2FhNDcyMmY0Y2E3ODdiYTQuYmluZFBvcHVwKHBvcHVwX2U1Mzg3NTdhMGI0MTQ5OGI5YmQ1OGZhNTNkMWVhZmNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljYjM5Nzc5ZGVjODRhY2I5Mzc5ZDkzYjRlYjEwOTFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk1MzczOTk3NTIxNzgsOC41MDU3NzQxMjEzMTk0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWVmMmE1MTMyMDIzNGZkYWFmZWVmZjFlNzEzNWIzMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDM5YjE1NGFlMTM4NDI0ZmE3NjNkNjk2MjQ0MzYwNDIgPSAkKCc8ZGl2IGlkPSJodG1sXzQzOWIxNTRhZTEzODQyNGZhNzYzZDY5NjI0NDM2MDQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZXN0YXVyYW50IFR1cmJpbmVuaGF1czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWVmMmE1MTMyMDIzNGZkYWFmZWVmZjFlNzEzNWIzMjIuc2V0Q29udGVudChodG1sXzQzOWIxNTRhZTEzODQyNGZhNzYzZDY5NjI0NDM2MDQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljYjM5Nzc5ZGVjODRhY2I5Mzc5ZDkzYjRlYjEwOTFkLmJpbmRQb3B1cChwb3B1cF9lZWYyYTUxMzIwMjM0ZmRhYWZlZWZmMWU3MTM1YjMyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZGEwM2M3NjJmNGM0NmQ4YTk4MGRlNTAyODU4MTU2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDI4MTIxLDguNTAzNjg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDNmZDBmNjc5ZWM0NDA3OTkwMTllYTI5MGQ0YzI2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NTAxYmMwMmY4ZDQ0ZTkxOTBhMjUzNDFhNmU3NzVmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfODUwMWJjMDJmOGQ0NGU5MTkwYTI1MzQxYTZlNzc1ZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbCBTb2xlIFBpenpha3VyaWVyIEjDtm5nZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAzZmQwZjY3OWVjNDQwNzk5MDE5ZWEyOTBkNGMyNmQuc2V0Q29udGVudChodG1sXzg1MDFiYzAyZjhkNDRlOTE5MGEyNTM0MWE2ZTc3NWZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkYTAzYzc2MmY0YzQ2ZDhhOTgwZGU1MDI4NTgxNTYxLmJpbmRQb3B1cChwb3B1cF8zMDNmZDBmNjc5ZWM0NDA3OTkwMTllYTI5MGQ0YzI2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDJhMTVkYTVkYWU0NjhjYWY1ZWU5NjhmZGMwYzIyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjc3OTAyODYyNDI4LDguNDkyNDk2MDEzNjQxMzU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZmQwZmU1MWQ4NjE0OGVjOGEzZjBmZjcyYmZlMmRjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZjQ0ZGMyMTgxYzU0OGIxYmUxYjU2ZGQwYmY5NWE1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmY0NGRjMjE4MWM1NDhiMWJlMWI1NmRkMGJmOTVhNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1haGFyYW5pPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZmQwZmU1MWQ4NjE0OGVjOGEzZjBmZjcyYmZlMmRjOS5zZXRDb250ZW50KGh0bWxfYmY0NGRjMjE4MWM1NDhiMWJlMWI1NmRkMGJmOTVhNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjQyYTE1ZGE1ZGFlNDY4Y2FmNWVlOTY4ZmRjMGMyMmQuYmluZFBvcHVwKHBvcHVwX2VmZDBmZTUxZDg2MTQ4ZWM4YTNmMGZmNzJiZmUyZGM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhZTZjZmEyNmMxMjRkYWRiNGRjZmNmMTdjM2Q4Y2U3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5MzUyNjQ0NjIwNDksOC40ODkzNjEyOTI0MzM2MTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ4NDYzOGEyN2IyMDRiZWE5ZDlhY2JlZGQwYmY4NzMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzOTM5NjljZThhYTQ5YWM5ZDM0ZWZkMjgyMTU4Nzg4ID0gJCgnPGRpdiBpZD0iaHRtbF9mMzkzOTY5Y2U4YWE0OWFjOWQzNGVmZDI4MjE1ODc4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVzdGF1cmFudCBXZXJkaW5zZWw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ4NDYzOGEyN2IyMDRiZWE5ZDlhY2JlZGQwYmY4NzMyLnNldENvbnRlbnQoaHRtbF9mMzkzOTY5Y2U4YWE0OWFjOWQzNGVmZDI4MjE1ODc4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YWU2Y2ZhMjZjMTI0ZGFkYjRkY2ZjZjE3YzNkOGNlNy5iaW5kUG9wdXAocG9wdXBfNDg0NjM4YTI3YjIwNGJlYTlkOWFjYmVkZDBiZjg3MzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjliM2MyNzIzNDI3NDc4NmE1YTFhN2ZlNjcxMDQ4MjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDgwMTQyNTM1MTk1MSw4LjUwNzY4MTMyNzQ5MjU3N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDE4NTkyZjgyYTZkNDZlZmFiOGVlMDg2NTdjYTJjYjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTlmODVjNzM1M2Q4NDk5ZGExNTVjOWI3N2YyZTBlZGUgPSAkKCc8ZGl2IGlkPSJodG1sXzE5Zjg1YzczNTNkODQ5OWRhMTU1YzliNzdmMmUwZWRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FVEggQ2hlbWllY2FmZXRlcmlhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTg1OTJmODJhNmQ0NmVmYWI4ZWUwODY1N2NhMmNiNC5zZXRDb250ZW50KGh0bWxfMTlmODVjNzM1M2Q4NDk5ZGExNTVjOWI3N2YyZTBlZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjliM2MyNzIzNDI3NDc4NmE1YTFhN2ZlNjcxMDQ4MjQuYmluZFBvcHVwKHBvcHVwX2QxODU5MmY4MmE2ZDQ2ZWZhYjhlZTA4NjU3Y2EyY2I0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1MjRhNDUzNmUxZjRhZjI5N2I4Yzk2YjcyNzM5Nzc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA4MzExNTAxNjQ0NzEsOC41MDc2MjcyNzYzNDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mM2EwMGU2Y2YwYTQ0ODM3ODJlMjIwZWU0MmQwOThiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOGJjNzNjZWRmZDM0NzQ2OTE3ZDdiMDE4MTk4ZjdmYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZThiYzczY2VkZmQzNDc0NjkxN2Q3YjAxODE5OGY3ZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNWIEJpc3RybyBIw7ZuZ2dlcmJlcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YzYTAwZTZjZjBhNDQ4Mzc4MmUyMjBlZTQyZDA5OGJkLnNldENvbnRlbnQoaHRtbF9lOGJjNzNjZWRmZDM0NzQ2OTE3ZDdiMDE4MTk4ZjdmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNTI0YTQ1MzZlMWY0YWYyOTdiOGM5NmI3MjczOTc3Ny5iaW5kUG9wdXAocG9wdXBfZjNhMDBlNmNmMGE0NDgzNzgyZTIyMGVlNDJkMDk4YmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBwb2x5X2xpbmVfYWExNDNjNDZlOTk2NDI4NWFjYWY4MzUwNjk1MGVmOGUgPSBMLnBvbHlsaW5lKAogICAgICAgICAgICAgICAgICAgIFtbNDcuNDAzNTcyOSwgOC40OTg2MjY4XSwgWzQ3LjQwMzAwMDg0NDk2OTQxLCA4LjQ5ODIwNjAxMTMwMDI2N11dLAogICAgICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJub0NsaXAiOiBmYWxzZSwKICAib3BhY2l0eSI6IDEuMCwKICAic21vb3RoRmFjdG9yIjogMS4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0pLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciByZWd1bGFyX3BvbHlnb25fbWFya2VyXzFlMDkwNzRlNzVkNjQ4MGVhODE4NWM2MzI4MjFlZGFhID0gbmV3IEwuUmVndWxhclBvbHlnb25NYXJrZXIoCiAgICAgICAgICAgICAgICBuZXcgTC5MYXRMbmcoNDcuNDAzMjg2ODcyNDg0NzA2LDguNDk4NDE2NDA1NjUwMTMzKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2lkZXM6IDMsCiAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IDExNi40NjcwODU3MDI1NTU4LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV9iNTc3MzNhNjlhYmM0ZWNmYWFmYWY1YzFmNjI5YmFhZiA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDMwMDA4NDQ5Njk0MSwgOC40OTgyMDYwMTEzMDAyNjddLCBbNDcuNDAyODgzOSwgOC40OTk1ODA4NDc3MjYwMjNdXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl81ZWUwZDhmYTg2YzI0NzhlYjNmMmFiYjE5NjI5YTQ2ZiA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMjk0MjM3MjQ4NDcsOC40OTg4OTM0Mjk1MTMxNDYpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb24gOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogNy4xNjI1MzQyNDU5MzM5MjY1LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV8zMjBkMzY2NjJlZDA0YmE1YjYxYzJkZWI0NTM4MTgxYiA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDI4ODM5LCA4LjQ5OTU4MDg0NzcyNjAyM10sIFs0Ny40MDM1NzI5LCA4LjQ5ODYyNjhdXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl81YTY4ZmExYmQ5OTc0NzFiOTcyODExY2YwYzVhMWYwMSA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMzIyODQsOC40OTkxMDM4MjM4NjMwMTEpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb24gOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdncmVlbicsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogMjI2Ljg1NzAzOTg1MjAzMzA0LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV9iNDJkYjgxZDRjZjY0NGZjOTJjMzhjOWM1NjQzZDYxNyA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDI0MTEzLCA4LjQ5NzYyODUwOTk3ODE4OF0sIFs0Ny40MDMwMDA4NDQ5Njk0MSwgOC40OTgyMDYwMTEzMDAyNjddXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJub0NsaXAiOiBmYWxzZSwKICAib3BhY2l0eSI6IDEuMCwKICAic21vb3RoRmFjdG9yIjogMS4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0pLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciByZWd1bGFyX3BvbHlnb25fbWFya2VyXzE4MDk2ZjNmMDIxYzRiZDY4MmI3ODM5NDMyMTYwOGY1ID0gbmV3IEwuUmVndWxhclBvbHlnb25NYXJrZXIoCiAgICAgICAgICAgICAgICBuZXcgTC5MYXRMbmcoNDcuNDAyNzA2MDcyNDg0NzA1LDguNDk3OTE3MjYwNjM5MjI3KSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAnb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNpZGVzOiAzLAogICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiAtNTYuNDU1MjY5MDA2ODY2MTA0LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV9lY2NhNzI4YmQ2YzU0MmM1ODM4MDU0OGEyYTUxY2FkMyA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDMwMDA4NDQ5Njk0MSwgOC40OTgyMDYwMTEzMDAyNjddLCBbNDcuNDAyODgzOSwgOC40OTk1ODA4NDc3MjYwMjNdXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJub0NsaXAiOiBmYWxzZSwKICAib3BhY2l0eSI6IDEuMCwKICAic21vb3RoRmFjdG9yIjogMS4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0pLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciByZWd1bGFyX3BvbHlnb25fbWFya2VyX2M1ODY5YTRhNmQ3NzRkNDc4MmQ5MTQzNmYyODk4NDc3ID0gbmV3IEwuUmVndWxhclBvbHlnb25NYXJrZXIoCiAgICAgICAgICAgICAgICBuZXcgTC5MYXRMbmcoNDcuNDAyOTQyMzcyNDg0Nyw4LjQ5ODg5MzQyOTUxMzE0NiksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbiA6IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogNy4xNjI1MzQyNDU5MzM5MjY1LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV82MWMyMGQyYTUxODQ0YmZkYTdlYzQ3YjZiZjZiNzMxYyA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDI4ODM5LCA4LjQ5OTU4MDg0NzcyNjAyM10sIFs0Ny40MDI0MTEzLCA4LjQ5NzYyODUwOTk3ODE4OF1dLAogICAgICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIm9yYW5nZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm5vQ2xpcCI6IGZhbHNlLAogICJvcGFjaXR5IjogMS4wLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfSkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHJlZ3VsYXJfcG9seWdvbl9tYXJrZXJfMTE3NDkwN2IyMDFjNDVkMGE2NzBlMDQ5MjI0Yzg2MjEgPSBuZXcgTC5SZWd1bGFyUG9seWdvbk1hcmtlcigKICAgICAgICAgICAgICAgIG5ldyBMLkxhdExuZyg0Ny40MDI2NDc1OTk5OTk5OTUsOC40OTg2MDQ2Nzg4NTIxMDUpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb24gOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2lkZXM6IDMsCiAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IDE2MC4zMjE0MTAyNDQyMzU5LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV81YWRlYzhiM2QzYTA0ZTg2YTE5ZjdiMzFmODI1ZmY3YiA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDM5Nzc0NSwgOC40OTgzMjAwODA3Njg3MjVdLCBbNDcuNDAzMDAwODQ0OTY5NDEsIDguNDk4MjA2MDExMzAwMjY3XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfYTA3OWM1NTg5NTQzNDRhYWI1NjQ3OTA5NDk5YTRiNzgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl9iOGEwNmQ3ODM5N2M0NDBiOThjNmJkZTk2MTM0ZTYxZiA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMzQ4OTE0NzQ4NDcwNiw4LjQ5ODI2MzA0NjAzNDQ5NSksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbiA6IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogOTQuNTIwMTc0MDY3ODg5NTEsCiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiA2CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgcG9seV9saW5lXzE0ZTFmYTRhNTRlOTRiOGRiYmNiZjZjNWNjNzkxMzJjID0gTC5wb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbWzQ3LjQwMzAwMDg0NDk2OTQxLCA4LjQ5ODIwNjAxMTMwMDI2N10sIFs0Ny40MDI4ODM5LCA4LjQ5OTU4MDg0NzcyNjAyM11dLAogICAgICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm5vQ2xpcCI6IGZhbHNlLAogICJvcGFjaXR5IjogMS4wLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfSkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHJlZ3VsYXJfcG9seWdvbl9tYXJrZXJfZjdjNzU5M2ExOTBiNGQwN2JmYmYzNWEzYjUxNzg1NzYgPSBuZXcgTC5SZWd1bGFyUG9seWdvbk1hcmtlcigKICAgICAgICAgICAgICAgIG5ldyBMLkxhdExuZyg0Ny40MDI5NDIzNzI0ODQ3LDguNDk4ODkzNDI5NTEzMTQ2KSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNpZGVzOiAzLAogICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiA3LjE2MjUzNDI0NTkzMzkyNjUsCiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiA2CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9hMDc5YzU1ODk1NDM0NGFhYjU2NDc5MDk0OTlhNGI3OCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgcG9seV9saW5lX2JmYjUwOWRiNzY5MzQ1NjZhZWZiYWY5YWI3MWQ3ZmY0ID0gTC5wb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbWzQ3LjQwMjg4MzksIDguNDk5NTgwODQ3NzI2MDIzXSwgWzQ3LjQwMzk3NzQ1LCA4LjQ5ODMyMDA4MDc2ODcyNV1dLAogICAgICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm5vQ2xpcCI6IGZhbHNlLAogICJvcGFjaXR5IjogMS4wLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfSkuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHJlZ3VsYXJfcG9seWdvbl9tYXJrZXJfNjRjMDNkMGZkNzM5NGQ3Mzk1YzE3NmY5MDllYTgyNzUgPSBuZXcgTC5SZWd1bGFyUG9seWdvbk1hcmtlcigKICAgICAgICAgICAgICAgIG5ldyBMLkxhdExuZyg0Ny40MDM0MzA2NzQ5OTk5OTYsOC40OTg5NTA0NjQyNDczNzQpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb24gOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2lkZXM6IDMsCiAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IDIzMi4wMzQ1NjM2ODA4NTg4NywKICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2EwNzljNTU4OTU0MzQ0YWFiNTY0NzkwOTQ5OWE0Yjc4KTsKICAgICAgICAgICAgCjwvc2NyaXB0Pg== 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 0x1a2758d090>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# draw base map with position markers\n", "folium_map=createRawMap(custLatitude, custLongitude, custAddr, helperData, venues, zoomStart=17)\n", "\n", "# add lines and arrows\n", "for pos in p:\n", " p1=[pos[0], pos[1]]\n", " p2=[pos[2], pos[3]]\n", " colorLine=pos[4]\n", " folium.PolyLine(locations=[p1, p2], color=colorLine).add_to(folium_map)\n", "\n", " arrows = get_arrows(locations=[p1, p2], color=colorLine, n_arrows=1)\n", " for arrow in arrows:\n", " arrow.add_to(folium_map)\n", " \n", "display(folium_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now this is really a funny coincidence. 2 of the \"helpers\" are living at \"Tertianum Residenz - Im Brühl\". This is a place where you can spend your retirement days.\n", "\n", "Maybe not the best location to recruit helpers, when the helpers belong to the risk group themselves.\n", "\n", "In real life, of course one would have to make reasonably sure, that the helpers are up for the task.\n", "\n", "Since this is only based on fake data extracted from OSINT sources, it's not relevant yet. But either way, this example once again shows that data cleaning is the most important process. Otherwise you'll have a lot of work for your model that ends producing in accordance to the garbage in garbage out principle.\n", "\n", "Here maybe it's the janitor and his 18 year old son, both living at the place and young and healthy?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<a id = \"tldr2\"></a>\n", "### That was fun. Let's try to apply the code to a different customer.\n", "\n", "Once you have arrived here, you can easily:\n", "1. plug in a different customer address (custAddr2) down below\n", "2. mark this cell\n", "3. jump to the [end of the notebook](#end) and hit shift and mark the last cell, then...\n", "3. hit run" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "custAddr_2 = 'Singlistrasse 11, 8049 Zurich' # <-- input address of choice here, then run rest of the notebook" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The geograpical coordinate of Singlistrasse 11, 8049 Zurich are 47.403521, 8.4947084.\n" ] } ], "source": [ "# convert address to location\n", "location_2 = geolocator.geocode(custAddr_2)\n", "custLatitude_2 = location_2.latitude\n", "custLongitude_2 = location_2.longitude\n", "print('The geograpical coordinate of {} are {}, {}.'.format(custAddr_2, custLatitude_2, custLongitude_2))" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Searching venues for hungrycustomer1942@bluewin.ch\n" ] }, { "data": { "text/plain": [ "(9, 7)" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "venues_2 = getNearbyVenues(names=['hungrycustomer1942@bluewin.ch'],\n", " latitudes=[custLatitude_2],\n", " longitudes=[custLongitude_2],\n", " radius=1000,\n", " categories='4d4b7105d754a06374d81259,4bf58dd8d48988d1f9941735,52f2ab2ebcbc57f1066b8b1c,50be8ee891d4fa8dcc7199a7,4bf58dd8d48988d10f951735,4bf58dd8d48988d1fd941735')\n", "venues_2.shape" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "# initialize variables\n", "numH_2 = helperData.shape[0] # number of helpers\n", "numS_2 = venues_2.shape[0] # number of shops\n", "numC_2 = 1 # test with only 1 customer\n", "HtoS_2 = np.zeros([numS_2, numH_2]) # 2-dim matrix, helpers in columns, shops in rows\n", "StoC_2 = np.zeros([numS_2,1]) # 1-dim matrix, shops in rows\n", "CtoH_2 = np.zeros([1, numH_2]) # 1-dim matrix, helpers in columns\n", "totDist_2 = np.zeros([numS_2, numH_2]) #2-dim matrix, helpers in columns, shops in rows" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "# calculate distances from all helpers to all shops (in meters rounded to whole numbers)\n", "for hId, helper in helperData.iterrows():\n", " for sId, shop in venues_2.iterrows():\n", " tmpCord1 = (helper['latitude'], helper['longitude'])\n", " tmpCord2 = (shop['Venue Latitude'], shop['Venue Longitude'])\n", " HtoS_2[sId][hId]=round(geopy.distance.distance(tmpCord1, tmpCord2).m,0)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "# calculate distances from all shops to our customer (in meters rounded to whole numbers)\n", "tmpCord1 = (custLatitude_2, custLongitude_2)\n", "for sId, shop in venues_2.iterrows():\n", " tmpCord2 = (shop['Venue Latitude'], shop['Venue Longitude'])\n", " StoC_2[sId][0]=round(geopy.distance.distance(tmpCord1, tmpCord2).m,0)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "# calculate distances from our customer to all helpers (in meters rounded to whole numbers)\n", "tmpCord2 = (custLatitude_2, custLongitude_2)\n", "for hId, helper in helperData.iterrows():\n", " tmpCord1 = (helper['latitude'], helper['longitude'])\n", " CtoH_2[0][hId]=round(geopy.distance.distance(tmpCord1, tmpCord2).m,0) " ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "# calculate total distance\n", "totDist_2=HtoS_2+StoC_2+CtoH_2" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / shop: Argentina Steakhouse / helper: anneli05@aol.de\n", "2 / shop: Maharani / helper: kuschkarl-august@holzapfel.de\n", "3 / shop: Argentina Steakhouse / helper: olena23@web.de\n", "4 / shop: Osteria da Biagio / helper: kuschkarl-august@holzapfel.de\n", "5 / shop: Argentina Steakhouse / helper: iris38@beyer.de\n", "6 / shop: Osteria da Biagio / helper: metin34@aol.de\n", "7 / shop: Osteria da Biagio / helper: ehoerle@gmail.com\n", "8 / shop: Osteria da Biagio / helper: josef95@boerner.com\n", "9 / shop: Osteria da Biagio / helper: ditschlerinmehdi@googlemail.com\n", "10 / shop: Osteria da Biagio / helper: evelyneloeffler@paertzelt.de\n" ] } ], "source": [ "standard_score2 = normPerfectToZero(calcScores(HtoS_2, StoC_2, CtoH_2, totDist_2, standard_weights, hTrolley))\n", "standard_recommendation2=findKMinFromNp(standard_score2,10)\n", "printRecommendation(standard_recommendation2, venues_2)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / shop: Argentina Steakhouse / helper: anneli05@aol.de\n", "2 / shop: Argentina Steakhouse / helper: olena23@web.de\n", "3 / shop: Argentina Steakhouse / helper: iris38@beyer.de\n", "4 / shop: Osteria da Biagio / helper: kuschkarl-august@holzapfel.de\n", "5 / shop: Osteria da Biagio / helper: metin34@aol.de\n", "6 / shop: Osteria da Biagio / helper: ehoerle@gmail.com\n", "7 / shop: Osteria da Biagio / helper: josef95@boerner.com\n", "8 / shop: Osteria da Biagio / helper: ditschlerinmehdi@googlemail.com\n", "9 / shop: Osteria da Biagio / helper: evelyneloeffler@paertzelt.de\n", "10 / shop: Osteria da Biagio / helper: walburgajacob@gmx.de\n" ] } ], "source": [ "hot_heavy_frigo_score2 = normPerfectToZero(calcScores(HtoS_2, StoC_2, CtoH_2, totDist_2, hot_heavy_frigo_weights, hTrolley))\n", "hot_heavy_frigo_recommendation2=findKMinFromNp(hot_heavy_frigo_score2,10)\n", "printRecommendation(hot_heavy_frigo_recommendation2, venues_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To display the distances on the map, we need to extract the positions of our top 3 helper shop combinations:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "topHelper=helperData.iloc[standard_recommendation2[0][1]]\n", "topVenue=venues_2.iloc[standard_recommendation2[0][0]]\n", "secondHelper=helperData.iloc[standard_recommendation2[1][1]]\n", "secondVenue=venues_2.iloc[standard_recommendation2[1][0]]\n", "thirdHelper=helperData.iloc[standard_recommendation2[2][1]]\n", "thirdVenue=venues_2.iloc[standard_recommendation2[2][0]]\n", "custLat=custLatitude_2\n", "custLong=custLongitude_2\n", "\n", "p=[]\n", "\n", "p.append([topHelper['latitude'], topHelper['longitude'], topVenue['Venue Latitude'], topVenue['Venue Longitude'], 'green'])\n", "p.append([topVenue['Venue Latitude'], topVenue['Venue Longitude'], custLat, custLong, 'green'])\n", "p.append([custLat, custLong, topHelper['latitude'], topHelper['longitude'], 'green'])\n", "\n", "p.append([secondHelper['latitude'], secondHelper['longitude'], secondVenue['Venue Latitude'], secondVenue['Venue Longitude'], 'orange'])\n", "p.append([secondVenue['Venue Latitude'], secondVenue['Venue Longitude'], custLat, custLong, 'orange'])\n", "p.append([custLat, custLong, secondHelper['latitude'], secondHelper['longitude'], 'orange'])\n", "\n", "p.append([thirdHelper['latitude'], thirdHelper['longitude'], thirdVenue['Venue Latitude'], thirdVenue['Venue Longitude'], 'red'])\n", "p.append([thirdVenue['Venue Latitude'], thirdVenue['Venue Longitude'], custLat, custLong, 'red'])\n", "p.append([custLat, custLong, thirdHelper['latitude'], thirdHelper['longitude'], 'red'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Now we can draw the final map:**" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><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+ICNtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQtZHZmLzAuMy4wL2xlYWZsZXQtZHZmLm1hcmtlcnMubWluLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzQ3LjQwMzUyMSw4LjQ5NDcwODRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzkyMDQ2MGEwZmQ2MzRjZTM4OGRiZjdhMDZkNTQ2NDdjID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Njc4OGE2ZTEwNTI0YWY5OTkwMDQxYzJkYjgwMGY1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzUyMSw4LjQ5NDcwODRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzRmNWFhNzQ1YmQ2NDg1OTg4Y2M0NjU4ZGRkYzUyNDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGVjMTEzYzA4MGI0NGQ5ZDlkMjQ5ZGIyN2E3OTA0OTQgPSAkKCc8ZGl2IGlkPSJodG1sXzhlYzExM2MwODBiNDRkOWQ5ZDI0OWRiMjdhNzkwNDk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TaW5nbGlzdHJhc3NlIDExLCA4MDQ5IFp1cmljaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzRmNWFhNzQ1YmQ2NDg1OTg4Y2M0NjU4ZGRkYzUyNDMuc2V0Q29udGVudChodG1sXzhlYzExM2MwODBiNDRkOWQ5ZDI0OWRiMjdhNzkwNDk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2Nzg4YTZlMTA1MjRhZjk5OTAwNDFjMmRiODAwZjUzLmJpbmRQb3B1cChwb3B1cF83NGY1YWE3NDViZDY0ODU5ODhjYzQ2NThkZGRjNTI0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yN2Q5NTI0OTY5NDc0YzdiYmEwOGNhMGJjNmJmMTg1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNDU4ODIsOC40OTU2OTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5NzEzMWRlZWNhMjRkOTZiZmJhNWI4MTM3ZWUwNTJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1NTc1NzYyZDJiMDRjNjZiNGZjM2U5MzFiNDlmMmMxID0gJCgnPGRpdiBpZD0iaHRtbF8zNTU3NTc2MmQyYjA0YzY2YjRmYzNlOTMxYjQ5ZjJjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+b2xlbmEyM0B3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5NzEzMWRlZWNhMjRkOTZiZmJhNWI4MTM3ZWUwNTJkLnNldENvbnRlbnQoaHRtbF8zNTU3NTc2MmQyYjA0YzY2YjRmYzNlOTMxYjQ5ZjJjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yN2Q5NTI0OTY5NDc0YzdiYmEwOGNhMGJjNmJmMTg1ZS5iaW5kUG9wdXAocG9wdXBfMTk3MTMxZGVlY2EyNGQ5NmJmYmE1YjgxMzdlZTA1MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJkMTkxZWRmN2E3NDcyZjgxNmI0MDgwZjlkMzY2YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY4MzM1LDguNDg2MzY0Nzg4MzM2NDc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjMGE0YTliYWU2NzRiODZhNTA5YjkxYmQyMjEyMGQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlNzdiNTE2OWY4NTQ1YjliZGE5ODQ3NGYxYzEyNzMzID0gJCgnPGRpdiBpZD0iaHRtbF80ZTc3YjUxNjlmODU0NWI5YmRhOTg0NzRmMWMxMjczMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWJkdWwzN0Bsb3JjaC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2MwYTRhOWJhZTY3NGI4NmE1MDliOTFiZDIyMTIwZDMuc2V0Q29udGVudChodG1sXzRlNzdiNTE2OWY4NTQ1YjliZGE5ODQ3NGYxYzEyNzMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyZDE5MWVkZjdhNzQ3MmY4MTZiNDA4MGY5ZDM2NmE2LmJpbmRQb3B1cChwb3B1cF83YzBhNGE5YmFlNjc0Yjg2YTUwOWI5MWJkMjIxMjBkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYmZhOGEzMzc0MGI0Y2Y1YmNlNGNjM2UxNmFkMmZlNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTgxODg5OTk5OTk5NSw4LjUwMjkwNDEwOTc0NzM1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzJhMTVlZDdmNTU0OWY5OGVmMTEwOTM0YjU2OTRhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNTQ1N2EyODdjODI0Y2NjYTM3Y2JjMjJlYjgyZTZmZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzU0NTdhMjg3YzgyNGNjY2EzN2NiYzIyZWI4MmU2ZmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJvbjA2QGV0emxlci5vcmc8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3MmExNWVkN2Y1NTQ5Zjk4ZWYxMTA5MzRiNTY5NGFkLnNldENvbnRlbnQoaHRtbF9jNTQ1N2EyODdjODI0Y2NjYTM3Y2JjMjJlYjgyZTZmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYmZhOGEzMzc0MGI0Y2Y1YmNlNGNjM2UxNmFkMmZlNi5iaW5kUG9wdXAocG9wdXBfZjcyYTE1ZWQ3ZjU1NDlmOThlZjExMDkzNGI1Njk0YWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNkZjNlNTRjZjViNDNjYmI5ODU1MmI5ODY1YjVkNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTM5MzYyLDguNDc3ODI0NDI5NDc1NDY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyNTc4YWU3YzkzMzQ0OTQ5MWVkYjQ2MGNhYjczMTdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I4OTdmYzk0NTJjMDRkZTJhNzg2YmRlMzk1ZDk2YjJmID0gJCgnPGRpdiBpZD0iaHRtbF9iODk3ZmM5NDUyYzA0ZGUyYTc4NmJkZTM5NWQ5NmIyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RhbmlzbGF3MTFAZ29ybGl0ei5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyNTc4YWU3YzkzMzQ0OTQ5MWVkYjQ2MGNhYjczMTdhLnNldENvbnRlbnQoaHRtbF9iODk3ZmM5NDUyYzA0ZGUyYTc4NmJkZTM5NWQ5NmIyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xY2RmM2U1NGNmNWI0M2NiYjk4NTUyYjk4NjViNWQ2NC5iaW5kUG9wdXAocG9wdXBfMzI1NzhhZTdjOTMzNDQ5NDkxZWRiNDYwY2FiNzMxN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDE0ZjBhY2IxY2ZhNDNkYjhiMzc0MjhkYjBhNGI0YzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDUyNzg0OTk5OTk5OTQsOC41MDA2NTM0NDk5OTk5OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDAxMmQ4YzU5MzI0NDk5Yjk4YjZhZGM3YjY0ZDI5MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGZlM2UxMWI2ZGUxNDFiMDgxNWFhOTE4MjlkMzE5YmMgPSAkKCc8ZGl2IGlkPSJodG1sX2RmZTNlMTFiNmRlMTQxYjA4MTVhYTkxODI5ZDMxOWJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5kb3JsZWJvZXJuZXJAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMDEyZDhjNTkzMjQ0OTliOThiNmFkYzdiNjRkMjkxNS5zZXRDb250ZW50KGh0bWxfZGZlM2UxMWI2ZGUxNDFiMDgxNWFhOTE4MjlkMzE5YmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDE0ZjBhY2IxY2ZhNDNkYjhiMzc0MjhkYjBhNGI0YzUuYmluZFBvcHVwKHBvcHVwXzAwMTJkOGM1OTMyNDQ5OWI5OGI2YWRjN2I2NGQyOTE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2YmUyMTdkMWEwMDQ3ZDY4MjAxYjNmZjkwM2VkN2FhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0NzAxNiw4LjQ5MjA4Mzk1MDg2NTM4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWU0MzAyMjllYWI0ZWU3OTE2YmExZGUyNmUyNmRkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYzI2MzczNDcwN2U0MDNlOTI2YmY4YWI0MmI5MzNlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZmMyNjM3MzQ3MDdlNDAzZTkyNmJmOGFiNDJiOTMzZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5rcmF1c2VAcmVpbmhhcmR0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWFlNDMwMjI5ZWFiNGVlNzkxNmJhMWRlMjZlMjZkZDAuc2V0Q29udGVudChodG1sX2ZjMjYzNzM0NzA3ZTQwM2U5MjZiZjhhYjQyYjkzM2VjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I2YmUyMTdkMWEwMDQ3ZDY4MjAxYjNmZjkwM2VkN2FhLmJpbmRQb3B1cChwb3B1cF9lYWU0MzAyMjllYWI0ZWU3OTE2YmExZGUyNmUyNmRkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZGY0Y2JjZThjZGM0MzIzODU2YzRmMzA5ZjQzYzhjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzcwNDMsOC40ODUwNzAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3OGZiNGM0ZWU3ZjRhYmRiMzIwMjYzODdlYzM1MzVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkNGM1YjJlYWUxMjRjNmZhOWQ1MDU2ODE3ZTkzNjhlID0gJCgnPGRpdiBpZD0iaHRtbF8yZDRjNWIyZWFlMTI0YzZmYTlkNTA1NjgxN2U5MzY4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+am9lcmdlbjY4QGhldXNlci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTc4ZmI0YzRlZTdmNGFiZGIzMjAyNjM4N2VjMzUzNWUuc2V0Q29udGVudChodG1sXzJkNGM1YjJlYWUxMjRjNmZhOWQ1MDU2ODE3ZTkzNjhlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkZjRjYmNlOGNkYzQzMjM4NTZjNGYzMDlmNDNjOGNiLmJpbmRQb3B1cChwb3B1cF9lNzhmYjRjNGVlN2Y0YWJkYjMyMDI2Mzg3ZWMzNTM1ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wN2FiYzFiZGFhYTA0YjYzODYwZWNiOTU5MmFiMzRkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzExNyw4LjQ5MzY4MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjgxYmJiMDQwYzJmNDc2NjkwZDQwNWFhOGM4YWE0MDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjUxZjMyOWEwYmY4NGNhYjhiMTc5OTgwZDc1MWQxNDIgPSAkKCc8ZGl2IGlkPSJodG1sXzI1MWYzMjlhMGJmODRjYWI4YjE3OTk4MGQ3NTFkMTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rdXNjaGthcmwtYXVndXN0QGhvbHphcGZlbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjgxYmJiMDQwYzJmNDc2NjkwZDQwNWFhOGM4YWE0MDcuc2V0Q29udGVudChodG1sXzI1MWYzMjlhMGJmODRjYWI4YjE3OTk4MGQ3NTFkMTQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA3YWJjMWJkYWFhMDRiNjM4NjBlY2I5NTkyYWIzNGQxLmJpbmRQb3B1cChwb3B1cF8yODFiYmIwNDBjMmY0NzY2OTBkNDA1YWE4YzhhYTQwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZWFkMGM1NDYyYzQ0YTM1YTNjM2QzMzNiN2M1YTRkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlZmMyODJlYWEyMjRjZTE5YWFjNmRiYTQ5NTY3MzNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyYzc5Y2UwMjMxMzQ3ZmI5YTgwNGFmZDM3MWY0MzcwID0gJCgnPGRpdiBpZD0iaHRtbF8wMmM3OWNlMDIzMTM0N2ZiOWE4MDRhZmQzNzFmNDM3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWV0aW4zNEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlZmMyODJlYWEyMjRjZTE5YWFjNmRiYTQ5NTY3MzNkLnNldENvbnRlbnQoaHRtbF8wMmM3OWNlMDIzMTM0N2ZiOWE4MDRhZmQzNzFmNDM3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZWFkMGM1NDYyYzQ0YTM1YTNjM2QzMzNiN2M1YTRkZS5iaW5kUG9wdXAocG9wdXBfMGVmYzI4MmVhYTIyNGNlMTlhYWM2ZGJhNDk1NjczM2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE4ZGNkOTE1MWU1NGU0Yzg3MTU0NzNiMzAwZDg0ZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAzODU4LDguNTA5NDA2MDUxNzg3ODQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmZTgzNjBmMDUxMDQwOWRhZWY4MzQ0ODE0MTNjZWQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0ZDRlNzVhYmZjYzRiOTViYjg2YzkzNjlkNWUyNjQyID0gJCgnPGRpdiBpZD0iaHRtbF8xNGQ0ZTc1YWJmY2M0Yjk1YmI4NmM5MzY5ZDVlMjY0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWFyaWNhanVuY2tAbmV1c2NoYWVmZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmZTgzNjBmMDUxMDQwOWRhZWY4MzQ0ODE0MTNjZWQ1LnNldENvbnRlbnQoaHRtbF8xNGQ0ZTc1YWJmY2M0Yjk1YmI4NmM5MzY5ZDVlMjY0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMThkY2Q5MTUxZTU0ZTRjODcxNTQ3M2IzMDBkODRlNi5iaW5kUG9wdXAocG9wdXBfOGZlODM2MGYwNTEwNDA5ZGFlZjgzNDQ4MTQxM2NlZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTcyOGQxOTRkZjgyNGFmMmEzYTBlZDA5ODdiYWYwMDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg1MTIwNDk5OTk5OTQsOC41MTExNDQ0NDM5NjczMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTM1ZDIwZDdmZmFlNGVlNTlkODlkODQ0ZDFlYmNmYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmU5N2JkNTA1NGYzNDZjNjg2OTA3MDk4MDdhZmJmZjcgPSAkKCc8ZGl2IGlkPSJodG1sXzJlOTdiZDUwNTRmMzQ2YzY4NjkwNzA5ODA3YWZiZmY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hYm9obGFuZGVyQHNlaWZlcnQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzNWQyMGQ3ZmZhZTRlZTU5ZDg5ZDg0NGQxZWJjZmFlLnNldENvbnRlbnQoaHRtbF8yZTk3YmQ1MDU0ZjM0NmM2ODY5MDcwOTgwN2FmYmZmNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NzI4ZDE5NGRmODI0YWYyYTNhMGVkMDk4N2JhZjAwNS5iaW5kUG9wdXAocG9wdXBfOTM1ZDIwZDdmZmFlNGVlNTlkODlkODQ0ZDFlYmNmYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTI4YTJjYWMzMTE2NDA0M2EyODYyMmMxOGUwNzkzMWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQyNDE5NSw4LjQ5MzQ5MjIxNDI0OTQwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWQ3NzkxYzNiNTY0Mjk2ODI3NTBhYTBlNzk2N2IwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMmU0ZWFhNTFhNWM0NTAyOWM2ODdhZTJlOGI4MmMyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTJlNGVhYTUxYTVjNDUwMjljNjg3YWUyZThiODJjMmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0aWZmZWxkb25hbGRAeWFob28uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhZDc3OTFjM2I1NjQyOTY4Mjc1MGFhMGU3OTY3YjA2LnNldENvbnRlbnQoaHRtbF9lMmU0ZWFhNTFhNWM0NTAyOWM2ODdhZTJlOGI4MmMyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjhhMmNhYzMxMTY0MDQzYTI4NjIyYzE4ZTA3OTMxYi5iaW5kUG9wdXAocG9wdXBfY2FkNzc5MWMzYjU2NDI5NjgyNzUwYWEwZTc5NjdiMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjFmNDYxNGI3Y2U5NDMyMDgwYzZjNGJhMWQ2NTVlNjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDE1MTc4NTAwMDAwMDUsOC41MDc4MzEwMzQwNjQ4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODE2ZjE3OGNhZDc0ZTlkOTI0ZDlmOTI0OWM5YTkyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDI5MTJhZDMzNDg0YjRjOWFmYWQyNjBmODNmZDkzOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQyOTEyYWQzMzQ4NGI0YzlhZmFkMjYwZjgzZmQ5MzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnpydXBwZXJ0QGxvZXdlci5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjgxNmYxNzhjYWQ3NGU5ZDkyNGQ5ZjkyNDljOWE5MjUuc2V0Q29udGVudChodG1sXzBkMjkxMmFkMzM0ODRiNGM5YWZhZDI2MGY4M2ZkOTM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIxZjQ2MTRiN2NlOTQzMjA4MGM2YzRiYTFkNjU1ZTY3LmJpbmRQb3B1cChwb3B1cF9iODE2ZjE3OGNhZDc0ZTlkOTI0ZDlmOTI0OWM5YTkyNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZmUwMTllMzkxYTE0MjliOTVmNjQ1ZmRkOWJlMTk3ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzU5MTMsOC41MDcyMzc3Mzg0ODIwNThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjJiNjgzM2QxNDdkNGI1NWE2MGI5YTY4NDRkNzY5ODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzllYTAwZjE5OTI3NDAyMTlmN2JiOTE2NDZlZDBmNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzM5ZWEwMGYxOTkyNzQwMjE5ZjdiYjkxNjQ2ZWQwZjcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5yYWxmLWRpZXRlcmtyZXVzZWxAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMmI2ODMzZDE0N2Q0YjU1YTYwYjlhNjg0NGQ3Njk4NS5zZXRDb250ZW50KGh0bWxfMzllYTAwZjE5OTI3NDAyMTlmN2JiOTE2NDZlZDBmNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWZlMDE5ZTM5MWExNDI5Yjk1ZjY0NWZkZDliZTE5N2YuYmluZFBvcHVwKHBvcHVwXzIyYjY4MzNkMTQ3ZDRiNTVhNjBiOWE2ODQ0ZDc2OTg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2NTBmMDc0YTAyMTRkODFhYTMxZWNlYWI3MmEwN2Y3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0ODMzNiw4LjUwMjE0NjAwMTg2NDI3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODI1YTdiNWNmYzQ0ZTk5OGYyNTM1NTZkMDE4MTcwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OWMxMTNmNWJhNTI0YzU0YTljYzJhNTMwNzFmZjBjZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjljMTEzZjViYTUyNGM1NGE5Y2MyYTUzMDcxZmYwY2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJhcmtob2x6dmFsZW50aW5lQGJhcnRoLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODI1YTdiNWNmYzQ0ZTk5OGYyNTM1NTZkMDE4MTcwMi5zZXRDb250ZW50KGh0bWxfNjljMTEzZjViYTUyNGM1NGE5Y2MyYTUzMDcxZmYwY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzY1MGYwNzRhMDIxNGQ4MWFhMzFlY2VhYjcyYTA3ZjcuYmluZFBvcHVwKHBvcHVwX2I4MjVhN2I1Y2ZjNDRlOTk4ZjI1MzU1NmQwMTgxNzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdmNmIyZGMzODYwNTQwMzRhMTA1ZGM5YWIyOTgyNDE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNjI4NTAwMDAwMDA2LDguNTA1NjU2MDQ4OTkwNzA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwODY4ZTRjNmY4ZjQxMjJiODZiOGFmOTk0MzcwNWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0NTFlMDFhMTFjZjQzNDI4ZmRmNWM0NTUzZDgxNmYzID0gJCgnPGRpdiBpZD0iaHRtbF8wNDUxZTAxYTExY2Y0MzQyOGZkZjVjNDU1M2Q4MTZmMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YW5pa2EzOEByb2h0LmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDA4NjhlNGM2ZjhmNDEyMmI4NmI4YWY5OTQzNzA1ZmIuc2V0Q29udGVudChodG1sXzA0NTFlMDFhMTFjZjQzNDI4ZmRmNWM0NTUzZDgxNmYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdmNmIyZGMzODYwNTQwMzRhMTA1ZGM5YWIyOTgyNDE4LmJpbmRQb3B1cChwb3B1cF8wMDg2OGU0YzZmOGY0MTIyYjg2YjhhZjk5NDM3MDVmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84N2JhYmQxNjVjY2Y0ZGQ5OWY3YTA5NWY5NDMwODllNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjM2NDIsOC40OTM4ODA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5YTE2N2I4YzdlNTQ1MWJiZDMwY2RlNDliZTdmYzVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhMTQ5Yzg3ZmE0NzQwNjY5YzBiZjVkM2NiNGZiMjc3ID0gJCgnPGRpdiBpZD0iaHRtbF83YTE0OWM4N2ZhNDc0MDY2OWMwYmY1ZDNjYjRmYjI3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZWhvZXJsZUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5YTE2N2I4YzdlNTQ1MWJiZDMwY2RlNDliZTdmYzVjLnNldENvbnRlbnQoaHRtbF83YTE0OWM4N2ZhNDc0MDY2OWMwYmY1ZDNjYjRmYjI3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84N2JhYmQxNjVjY2Y0ZGQ5OWY3YTA5NWY5NDMwODllNy5iaW5kUG9wdXAocG9wdXBfNzlhMTY3YjhjN2U1NDUxYmJkMzBjZGU0OWJlN2ZjNWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjYwMjI0ZjYyY2Y0NGY2YTk2MGYzYzZhN2Y2OWI2MDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQwNTYxNSw4LjQ5NTM3NTgwMjg1Njc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhiOTFlNjU3NGVhMDRmNzA4NjU1NDFkYmMwN2EzYWIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjMjE2MzJiMWQwZDQ3NzViMDIyOTY0ZTRhNGVmYjAxID0gJCgnPGRpdiBpZD0iaHRtbF8wYzIxNjMyYjFkMGQ0Nzc1YjAyMjk2NGU0YTRlZmIwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YW5uZWxpMDVAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjkxZTY1NzRlYTA0ZjcwODY1NTQxZGJjMDdhM2FiMS5zZXRDb250ZW50KGh0bWxfMGMyMTYzMmIxZDBkNDc3NWIwMjI5NjRlNGE0ZWZiMDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjYwMjI0ZjYyY2Y0NGY2YTk2MGYzYzZhN2Y2OWI2MDcuYmluZFBvcHVwKHBvcHVwXzhiOTFlNjU3NGVhMDRmNzA4NjU1NDFkYmMwN2EzYWIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1ZGE2YzAzM2YwMjQwOTliNTEyMzU2NWQwYWQ1NjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMzkzNjk5OTk5OTk1LDguNDkwMDE5Nzc2MjI4NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U3NGQ3MzBlZWEwNzRjZjE5YTk1ZDZmMmRlOGNlOTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhYmFmNDNiYTBhYTQ0ZWFhMzY3ZGUyYzhlY2E0ZjUyID0gJCgnPGRpdiBpZD0iaHRtbF82YWJhZjQzYmEwYWE0NGVhYTM2N2RlMmM4ZWNhNGY1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+enJpdHRlckBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3NGQ3MzBlZWEwNzRjZjE5YTk1ZDZmMmRlOGNlOTQwLnNldENvbnRlbnQoaHRtbF82YWJhZjQzYmEwYWE0NGVhYTM2N2RlMmM4ZWNhNGY1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNWRhNmMwMzNmMDI0MDk5YjUxMjM1NjVkMGFkNTYxYS5iaW5kUG9wdXAocG9wdXBfZTc0ZDczMGVlYTA3NGNmMTlhOTVkNmYyZGU4Y2U5NDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjAwMGZiMWUyM2Q4NDU4ODllNGI3M2MyNWY4ZGQxMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM5Nzc0NSw4LjQ5ODMyMDA4MDc2ODcyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOTQwODFiY2MxN2Y0NDgwODQwYjZiMDViMTJhODZkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNmQ0NjYyNjFkNTU0MTY2YTJjMmU3YjgwMTU0NTVkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTZkNDY2MjYxZDU1NDE2NmEyYzJlN2I4MDE1NDU1ZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJiYWNobWFubkB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5NDA4MWJjYzE3ZjQ0ODA4NDBiNmIwNWIxMmE4NmRkLnNldENvbnRlbnQoaHRtbF8xNmQ0NjYyNjFkNTU0MTY2YTJjMmU3YjgwMTU0NTVkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMDAwZmIxZTIzZDg0NTg4OWU0YjczYzI1ZjhkZDExZC5iaW5kUG9wdXAocG9wdXBfMTk0MDgxYmNjMTdmNDQ4MDg0MGI2YjA1YjEyYTg2ZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGM5NjA3YzdmMTI5NDkyMDgxYWIwYTUxMTMwYzM4YjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY2NTM2NDk5OTk5OTYsOC40OTM0NjQxNjM2MDA2MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QyMzJmOWY4NmMxNDBmYjkzYjJiNDc1ODVjNmNiZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjhjNzYzYWMxZmE1NDZjMzhlODgzNGFjYWZmMTUyZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzI4Yzc2M2FjMWZhNTQ2YzM4ZTg4MzRhY2FmZjE1MmU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5haGVzZXJAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDIzMmY5Zjg2YzE0MGZiOTNiMmI0NzU4NWM2Y2JmMC5zZXRDb250ZW50KGh0bWxfMjhjNzYzYWMxZmE1NDZjMzhlODgzNGFjYWZmMTUyZTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGM5NjA3YzdmMTI5NDkyMDgxYWIwYTUxMTMwYzM4YjYuYmluZFBvcHVwKHBvcHVwX2NkMjMyZjlmODZjMTQwZmI5M2IyYjQ3NTg1YzZjYmYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjMjk5OTZkZDE2MTQzZjhiYWE5MjYyMmE4ZTM1ZmJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NDc0MDUwMDAwMDA0LDguNTExNTYyNTQ3MTg3MDg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjNTBiNDA1Y2RkZDRmOWE4NzUzYTBmZDE0MzU0MGViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg3ZGIwMDMwMWZkMDQ5YTdhNjBlYjA4ZGZiYjcyNGU5ID0gJCgnPGRpdiBpZD0iaHRtbF84N2RiMDAzMDFmZDA0OWE3YTYwZWIwOGRmYmI3MjRlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cW5vYWNrQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjNTBiNDA1Y2RkZDRmOWE4NzUzYTBmZDE0MzU0MGViLnNldENvbnRlbnQoaHRtbF84N2RiMDAzMDFmZDA0OWE3YTYwZWIwOGRmYmI3MjRlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzI5OTk2ZGQxNjE0M2Y4YmFhOTI2MjJhOGUzNWZiYS5iaW5kUG9wdXAocG9wdXBfY2M1MGI0MDVjZGRkNGY5YTg3NTNhMGZkMTQzNTQwZWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZlNThmYTM5YWY4NDRlNDliZTZiYTNiMWRhMDNlYWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTY2M2EzODBhZmQ0ZGJhYWM1NzU1NTQ2MTViMDU4MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MjdlYjc2NTRkZDY0MDgxOGM4YzJmMTdmZmY5NWEyYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjI3ZWI3NjU0ZGQ2NDA4MThjOGMyZjE3ZmZmOTVhMmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmpvc2VmOTVAYm9lcm5lci5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhNjYzYTM4MGFmZDRkYmFhYzU3NTU1NDYxNWIwNTgzLnNldENvbnRlbnQoaHRtbF82MjdlYjc2NTRkZDY0MDgxOGM4YzJmMTdmZmY5NWEyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZmU1OGZhMzlhZjg0NGU0OWJlNmJhM2IxZGEwM2VhYi5iaW5kUG9wdXAocG9wdXBfM2E2NjNhMzgwYWZkNGRiYWFjNTc1NTU0NjE1YjA1ODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTdhMDhhNmY2NzBjNDdkN2E3NTE4ZTRmZTA2N2YyYzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcyNDUyNSw4LjQ5MjMxNjk5MjI5NDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1OWVlYjM0NTE0ZjRiZWQ4MWEzNDU1NjVkNjNlMmFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwN2Q5ZjQxZThkNjRmZmM5NzJkMjUzMDdiNTI5MjM3ID0gJCgnPGRpdiBpZD0iaHRtbF80MDdkOWY0MWU4ZDY0ZmZjOTcyZDI1MzA3YjUyOTIzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWVpbmhhcmRib2x6bWFubkB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1OWVlYjM0NTE0ZjRiZWQ4MWEzNDU1NjVkNjNlMmFmLnNldENvbnRlbnQoaHRtbF80MDdkOWY0MWU4ZDY0ZmZjOTcyZDI1MzA3YjUyOTIzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lN2EwOGE2ZjY3MGM0N2Q3YTc1MThlNGZlMDY3ZjJjMy5iaW5kUG9wdXAocG9wdXBfZDU5ZWViMzQ1MTRmNGJlZDgxYTM0NTU2NWQ2M2UyYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzkwYTY1ODkyOWIxNDI2ZjhhNGRkNmQ4OTU0ZDk0ZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDczNTI1LDguNDg3NTQ1OTkyMjc3MzAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwYjYzNDY0NDY4NTQzNmI5MjMyZmQ1YWRiZjMxZjRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmNmNkOGRjZjQ2YzRjNzNhNWY0MDIzYzcxNmJjOTliID0gJCgnPGRpdiBpZD0iaHRtbF81ZjZjZDhkY2Y0NmM0YzczYTVmNDAyM2M3MTZiYzk5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGVubmVyaG9mZm1hbm5AemlybWUuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMGI2MzQ2NDQ2ODU0MzZiOTIzMmZkNWFkYmYzMWY0Yi5zZXRDb250ZW50KGh0bWxfNWY2Y2Q4ZGNmNDZjNGM3M2E1ZjQwMjNjNzE2YmM5OWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzkwYTY1ODkyOWIxNDI2ZjhhNGRkNmQ4OTU0ZDk0ZTAuYmluZFBvcHVwKHBvcHVwX2MwYjYzNDY0NDY4NTQzNmI5MjMyZmQ1YWRiZjMxZjRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmY2U1ZGU0Mzg4OTQ2ZmZiMzhmZTFhMjc1YWVkZGNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMzkzNjk5OTk5OTk1LDguNDkwMDE5Nzc2MjI4NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4MDk1ZWIyNTU4ZjRjMjE4OTdjMDc5NDkzNzRiMTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0NTE2MGRmYmNhYjQzODA4ZjM5ZTNlNGJhNmQ2MDc5ID0gJCgnPGRpdiBpZD0iaHRtbF9lNDUxNjBkZmJjYWI0MzgwOGYzOWUzZTRiYTZkNjA3OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+d3J1cHBlcnRAZ3VkZS5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTgwOTVlYjI1NThmNGMyMTg5N2MwNzk0OTM3NGIxNzkuc2V0Q29udGVudChodG1sX2U0NTE2MGRmYmNhYjQzODA4ZjM5ZTNlNGJhNmQ2MDc5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmY2U1ZGU0Mzg4OTQ2ZmZiMzhmZTFhMjc1YWVkZGNiLmJpbmRQb3B1cChwb3B1cF9lODA5NWViMjU1OGY0YzIxODk3YzA3OTQ5Mzc0YjE3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NjAzNzgyNWM2YjY0NTJiODNiZTNiYTg2YmE2Y2VkYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwOTk3ODY1LDguNDgxMzEzNTE4MDUzMDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RiNjg2MDEwZDA0NzQ1ZmRiM2M3MjBjYmNmZmU5NGI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcwMWRlZjliMWVkOTRmYWI4ZTIzOGJiYTFkODIwYTM0ID0gJCgnPGRpdiBpZD0iaHRtbF83MDFkZWY5YjFlZDk0ZmFiOGUyMzhiYmExZDgyMGEzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YnJpZ2l0dGVtYXJncmFmQG1hcmdyYWYuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjY4NjAxMGQwNDc0NWZkYjNjNzIwY2JjZmZlOTRiNy5zZXRDb250ZW50KGh0bWxfNzAxZGVmOWIxZWQ5NGZhYjhlMjM4YmJhMWQ4MjBhMzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzYwMzc4MjVjNmI2NDUyYjgzYmUzYmE4NmJhNmNlZGIuYmluZFBvcHVwKHBvcHVwX2RiNjg2MDEwZDA0NzQ1ZmRiM2M3MjBjYmNmZmU5NGI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjYjk5ZDYxYjUxNTQ1YmJhODU3MGE4NzkyYTI4YThlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNjEzMTUsOC41MDQ5MzEyMTAxMjE0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzdiMzg1NTVjNTQ0NDI5ODk2ZTY1ZTRjYTBjY2JiZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVlMWFiMWJhYTQ1NGViZmI3ZWQ3N2FjYzk1YjljOTUgPSAkKCc8ZGl2IGlkPSJodG1sX2I1ZTFhYjFiYWE0NTRlYmZiN2VkNzdhY2M5NWI5Yzk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5hbGljZTU5QGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3YjM4NTU1YzU0NDQyOTg5NmU2NWU0Y2EwY2NiYmRiLnNldENvbnRlbnQoaHRtbF9iNWUxYWIxYmFhNDU0ZWJmYjdlZDc3YWNjOTViOWM5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zY2I5OWQ2MWI1MTU0NWJiYTg1NzBhODc5MmEyOGE4ZS5iaW5kUG9wdXAocG9wdXBfMzdiMzg1NTVjNTQ0NDI5ODk2ZTY1ZTRjYTBjY2JiZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDExY2FkY2RkYmZkNDcwNDkyNDU4YjViMzk2M2Q1NWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDA5MjE4LDguNTAxNjc0MjAwODc5MzA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNDIwNjYyZDc0NjQyYmFhMTEzOGVkM2VmZjYxZmZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5OGM2ZDkzODk3MzQ1MTdiNTA0NTZiOWFjMDU0ZGJmID0gJCgnPGRpdiBpZD0iaHRtbF82OThjNmQ5Mzg5NzM0NTE3YjUwNDU2YjlhYzA1NGRiZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YXVndXN0YXN0YWhyQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMTQyMDY2MmQ3NDY0MmJhYTExMzhlZDNlZmY2MWZmZC5zZXRDb250ZW50KGh0bWxfNjk4YzZkOTM4OTczNDUxN2I1MDQ1NmI5YWMwNTRkYmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDExY2FkY2RkYmZkNDcwNDkyNDU4YjViMzk2M2Q1NWQuYmluZFBvcHVwKHBvcHVwX2UxNDIwNjYyZDc0NjQyYmFhMTEzOGVkM2VmZjYxZmZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkOWQ4OGRiMjE1ZjRiYTJhMjQzODc1OTIyMTg4ZDYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMzY0Miw4LjQ5Mzg4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTQ3YjBhODRlNDA1NDY1NTkxY2U5MDExN2Y4ZDY2NDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E4YzRkNGY2MDU3NDcxZTk2OGQ1NTA4NzUyMDY4NGQgPSAkKCc8ZGl2IGlkPSJodG1sXzNhOGM0ZDRmNjA1NzQ3MWU5NjhkNTUwODc1MjA2ODRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5kaXRzY2hsZXJpbm1laGRpQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDdiMGE4NGU0MDU0NjU1OTFjZTkwMTE3ZjhkNjY0NC5zZXRDb250ZW50KGh0bWxfM2E4YzRkNGY2MDU3NDcxZTk2OGQ1NTA4NzUyMDY4NGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGQ5ZDg4ZGIyMTVmNGJhMmEyNDM4NzU5MjIxODhkNjMuYmluZFBvcHVwKHBvcHVwXzE0N2IwYTg0ZTQwNTQ2NTU5MWNlOTAxMTdmOGQ2NjQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkZDUwYjkyOTVlZjRlYjQ5NDg4M2Y0MWFlYjBmNTZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAwMTY5Miw4LjQ5NDI3MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjRiYjQ4MmFhYTZiNDViM2IzOGE3ZDk0MzRmMDIwMDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmZiNjllYzE3NWFmNDU5ZTljNjIxODg4OTBjNzBkOTcgPSAkKCc8ZGl2IGlkPSJodG1sXzJmYjY5ZWMxNzVhZjQ1OWU5YzYyMTg4ODkwYzcwZDk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5xcmllaGxAc2VpZGVsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjRiYjQ4MmFhYTZiNDViM2IzOGE3ZDk0MzRmMDIwMDAuc2V0Q29udGVudChodG1sXzJmYjY5ZWMxNzVhZjQ1OWU5YzYyMTg4ODkwYzcwZDk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlkZDUwYjkyOTVlZjRlYjQ5NDg4M2Y0MWFlYjBmNTZiLmJpbmRQb3B1cChwb3B1cF82NGJiNDgyYWFhNmI0NWIzYjM4YTdkOTQzNGYwMjAwMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNjRkZWQwZThhZjg0OWQzOWJlMmJkZTNmNjZjYmRhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODI0NDMsOC41MDgyNDY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3MjY2ZDY5MjY5NTQzYjlhMjc0YzNkNDU3M2U1MzhkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0ZDA2OTRiOGU1NTQ4M2Q5YzU0NTI1NWZkODRjZjRkID0gJCgnPGRpdiBpZD0iaHRtbF9lNGQwNjk0YjhlNTU0ODNkOWM1NDUyNTVmZDg0Y2Y0ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YmFydGhrbGF1ZGlhQHdlYi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjcyNjZkNjkyNjk1NDNiOWEyNzRjM2Q0NTczZTUzOGQuc2V0Q29udGVudChodG1sX2U0ZDA2OTRiOGU1NTQ4M2Q5YzU0NTI1NWZkODRjZjRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2NGRlZDBlOGFmODQ5ZDM5YmUyYmRlM2Y2NmNiZGEwLmJpbmRQb3B1cChwb3B1cF9iNzI2NmQ2OTI2OTU0M2I5YTI3NGMzZDQ1NzNlNTM4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZjRlOGJmZjM1ZDc0YmRiOWFkZmNmYWU3YzQxMDNhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDg0Mzc1LDguNDk5MzIwODM5Mjk0NDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwNzM1ZDNjNTA4ZDRkMWY5OTczMmI2YTFiMjRkNmM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3ZWIxMzg0ZTJhNTRlMDRhOWY5ZWNkOTBiNDhkYjhjID0gJCgnPGRpdiBpZD0iaHRtbF9lN2ViMTM4NGUyYTU0ZTA0YTlmOWVjZDkwYjQ4ZGI4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a3JlaW5iZXJ0YUBwYWVydHplbHQubmV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMDczNWQzYzUwOGQ0ZDFmOTk3MzJiNmExYjI0ZDZjOS5zZXRDb250ZW50KGh0bWxfZTdlYjEzODRlMmE1NGUwNGE5ZjllY2Q5MGI0OGRiOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWY0ZThiZmYzNWQ3NGJkYjlhZGZjZmFlN2M0MTAzYTQuYmluZFBvcHVwKHBvcHVwX2UwNzM1ZDNjNTA4ZDRkMWY5OTczMmI2YTFiMjRkNmM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhNzQ1YTE1Yzg0MzRlMGY4NjFhMmY4ZTFiMDIzNWFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2NDY2NTUsOC41MTAzODg3OTU2Mzc5NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzg1ZjBjYzhmYmZlNDZmOWE4N2UxY2UwNWViNThjN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWFhMWJhNTFkYjY0NDljMzg3NzQ0NDc5N2JhZDU0Y2EgPSAkKCc8ZGl2IGlkPSJodG1sXzVhYTFiYTUxZGI2NDQ5YzM4Nzc0NDQ3OTdiYWQ1NGNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5uaWNvbGViYXJ0aEBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzg1ZjBjYzhmYmZlNDZmOWE4N2UxY2UwNWViNThjN2Muc2V0Q29udGVudChodG1sXzVhYTFiYTUxZGI2NDQ5YzM4Nzc0NDQ3OTdiYWQ1NGNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhNzQ1YTE1Yzg0MzRlMGY4NjFhMmY4ZTFiMDIzNWFhLmJpbmRQb3B1cChwb3B1cF83ODVmMGNjOGZiZmU0NmY5YTg3ZTFjZTA1ZWI1OGM3Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZjBlZmIzNzEyNWE0NjkwYjBlZWE3OGFmMTM5YTMyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODU4MzIwMDAwMDAwNCw4LjUwNDEyOTgwMzAzMDE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzEzMWI4MjY3Mjc0NWY5YWQxYzYzZmRhYWIxZWRiYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iN2Q2NDljNDE3MWQ0NDMzOGZmZmE1MTBhOGZlY2IzZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjdkNjQ5YzQxNzFkNDQzMzhmZmZhNTEwYThmZWNiM2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm5rYWxsZXJ0QHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzEzMWI4MjY3Mjc0NWY5YWQxYzYzZmRhYWIxZWRiYS5zZXRDb250ZW50KGh0bWxfYjdkNjQ5YzQxNzFkNDQzMzhmZmZhNTEwYThmZWNiM2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmYwZWZiMzcxMjVhNDY5MGIwZWVhNzhhZjEzOWEzMjQuYmluZFBvcHVwKHBvcHVwX2NjMTMxYjgyNjcyNzQ1ZjlhZDFjNjNmZGFhYjFlZGJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4YjNkOGY2YTI0MTQzNTZhNjExZmRiY2Y3NjNhODgxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MDc0ODUsOC41MDQ1ODk5MDg4MzY3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjMxYjFjOTRlMDg5NDM5NjlmYjI1NGI1M2M0NmMzNjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTU5NjFkNjQ0YWE0NGRjOWI4Zjk3MmRjZmUxMDBkOTUgPSAkKCc8ZGl2IGlkPSJodG1sXzE1OTYxZDY0NGFhNDRkYzliOGY5NzJkY2ZlMTAwZDk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5iaXJnaXR0NTFAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjMxYjFjOTRlMDg5NDM5NjlmYjI1NGI1M2M0NmMzNjMuc2V0Q29udGVudChodG1sXzE1OTYxZDY0NGFhNDRkYzliOGY5NzJkY2ZlMTAwZDk1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U4YjNkOGY2YTI0MTQzNTZhNjExZmRiY2Y3NjNhODgxLmJpbmRQb3B1cChwb3B1cF8yMzFiMWM5NGUwODk0Mzk2OWZiMjU0YjUzYzQ2YzM2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmQ3YzZmZTJmNDU0N2RjOTdkMzdlNWYwOTg1ODI3NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjU0NTgsOC41MDY2Njg0MDkwNzY2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjljMzViNzc4M2JjNDQ1MTg1ZjhkNmM3ODRmNzNjYWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjIzZDIyMTZjNDllNDE4MTk3ZjY2NGU4OTc0OWY0NjcgPSAkKCc8ZGl2IGlkPSJodG1sX2IyM2QyMjE2YzQ5ZTQxODE5N2Y2NjRlODk3NDlmNDY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5waG9sdEBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjljMzViNzc4M2JjNDQ1MTg1ZjhkNmM3ODRmNzNjYWYuc2V0Q29udGVudChodG1sX2IyM2QyMjE2YzQ5ZTQxODE5N2Y2NjRlODk3NDlmNDY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiZDdjNmZlMmY0NTQ3ZGM5N2QzN2U1ZjA5ODU4Mjc2LmJpbmRQb3B1cChwb3B1cF8yOWMzNWI3NzgzYmM0NDUxODVmOGQ2Yzc4NGY3M2NhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjE5YjRhNjIzNzI0NGJlOTlhOWNhNTIxYjE4ZTdmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNDgwMzY0OTk5OTk5Niw4LjQ4MDAzMjYxODAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2VlMDAzNzlhYmFlNGZkMjlkZTQ0NTgyMTE3NGZjNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWY2YzM1MGM1MmNjNDJiZTg4Njc4OTFhZGE2MDEwZmIgPSAkKCc8ZGl2IGlkPSJodG1sX2FmNmMzNTBjNTJjYzQyYmU4ODY3ODkxYWRhNjAxMGZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oYXVzdGVybXVlaGxlQGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2VlMDAzNzlhYmFlNGZkMjlkZTQ0NTgyMTE3NGZjNmQuc2V0Q29udGVudChodG1sX2FmNmMzNTBjNTJjYzQyYmU4ODY3ODkxYWRhNjAxMGZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyMTliNGE2MjM3MjQ0YmU5OWE5Y2E1MjFiMThlN2Y4LmJpbmRQb3B1cChwb3B1cF9jZWUwMDM3OWFiYWU0ZmQyOWRlNDQ1ODIxMTc0ZmM2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjFhMzRlZTgwZmE0MzYwYTE0YjNjZTg4NWVjZWRkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMjk3MjgsOC40ODEyNTgzNjUwNTE0NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWVhNDc0NzFkNTA2NDI5ZjgzZjIwZjE4YTI4OTRjMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDE5MDE5NWU2YzNjNDYwM2I1Y2I4NGMyMjcwM2Y4NjEgPSAkKCc8ZGl2IGlkPSJodG1sXzQxOTAxOTVlNmMzYzQ2MDNiNWNiODRjMjI3MDNmODYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tb25qYTE1QHNjaGFlZmVyLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZWE0NzQ3MWQ1MDY0MjlmODNmMjBmMThhMjg5NGMwMi5zZXRDb250ZW50KGh0bWxfNDE5MDE5NWU2YzNjNDYwM2I1Y2I4NGMyMjcwM2Y4NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2YxYTM0ZWU4MGZhNDM2MGExNGIzY2U4ODVlY2VkZGEuYmluZFBvcHVwKHBvcHVwX2FlYTQ3NDcxZDUwNjQyOWY4M2YyMGYxOGEyODk0YzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwZmVhMDYwMzAzYTRmMGNiZWZhYjNlYzdjMzM4MjQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk1OTA0OCw4LjUxNDM3MjQ5NDA1Mjg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U1OTRjNTgzZjM1ZjQ0Y2Q5MTkwMjQyZDAwNzhiOWM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZjNDA0MzNhY2Q4ZjQ4NmNhYTI0Njc4NDM3MTAwNzhjID0gJCgnPGRpdiBpZD0iaHRtbF82YzQwNDMzYWNkOGY0ODZjYWEyNDY3ODQzNzEwMDc4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RlaW5iZXJnamVubmlmZXJAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTk0YzU4M2YzNWY0NGNkOTE5MDI0MmQwMDc4YjljOC5zZXRDb250ZW50KGh0bWxfNmM0MDQzM2FjZDhmNDg2Y2FhMjQ2Nzg0MzcxMDA3OGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzBmZWEwNjAzMDNhNGYwY2JlZmFiM2VjN2MzMzgyNDguYmluZFBvcHVwKHBvcHVwX2U1OTRjNTgzZjM1ZjQ0Y2Q5MTkwMjQyZDAwNzhiOWM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxMTMwZGUwZDhlZTQ1ZDI5NGRiYTM5ODZkYzRhZjMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MDQxMDUwMDAwMDA0LDguNDgzMzc5NjQ5OTg5MjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNjQxOTgxYjUxYjQ5ODM5NWVkYWY4ZDA4ZDVmNDI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4MjM0M2I3NzNiMTQ2MzU4NGQwMGUzMmFhYTQ1MTdiID0gJCgnPGRpdiBpZD0iaHRtbF85ODIzNDNiNzczYjE0NjM1ODRkMDBlMzJhYWE0NTE3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWVpa2JlaWVyQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDY0MTk4MWI1MWI0OTgzOTVlZGFmOGQwOGQ1ZjQyOS5zZXRDb250ZW50KGh0bWxfOTgyMzQzYjc3M2IxNDYzNTg0ZDAwZTMyYWFhNDUxN2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDExMzBkZTBkOGVlNDVkMjk0ZGJhMzk4NmRjNGFmMzMuYmluZFBvcHVwKHBvcHVwX2NkNjQxOTgxYjUxYjQ5ODM5NWVkYWY4ZDA4ZDVmNDI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViYTA1NmUyNGRmYzQ0NWRiNmZhYzUxNWEzYTU5ZmVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2Nzc2NzUwMDAwMDA2LDguNDk0MTU4MDQyMTIyODI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk3MGJkZGEzODIzZjRmOGJhNjdjMzRkZTQ0OWQzMDk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlOTExZTU4NjI3MzRmMzQ4MDgwNmRjMzgxZDMzZTViID0gJCgnPGRpdiBpZD0iaHRtbF9mZTkxMWU1ODYyNzM0ZjM0ODA4MDZkYzM4MWQzM2U1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YXNjaG9lbmxhbmRAbXVlaGxlLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NzBiZGRhMzgyM2Y0ZjhiYTY3YzM0ZGU0NDlkMzA5NS5zZXRDb250ZW50KGh0bWxfZmU5MTFlNTg2MjczNGYzNDgwODA2ZGMzODFkMzNlNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWJhMDU2ZTI0ZGZjNDQ1ZGI2ZmFjNTE1YTNhNTlmZWQuYmluZFBvcHVwKHBvcHVwXzk3MGJkZGEzODIzZjRmOGJhNjdjMzRkZTQ0OWQzMDk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3NDE5MWI5YTc1MzQ0OGQ5ZjdhMWI1YzUwNjhjMzc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2OTEzNDUsOC41MTE4MjEwMzM5ODc0MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI3ZjM5M2FhZGFiNDhkN2E3ODg1ODNjNGZkMDMxNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzljNjhmZjNmMjE1NDA5N2E0ZjBhY2QyNDQ4YmQ3NTkgPSAkKCc8ZGl2IGlkPSJodG1sXzM5YzY4ZmYzZjIxNTQwOTdhNGYwYWNkMjQ0OGJkNzU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5odWViZWxnZW9yZ2lvc0BnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyN2YzOTNhYWRhYjQ4ZDdhNzg4NTgzYzRmZDAzMTQ3LnNldENvbnRlbnQoaHRtbF8zOWM2OGZmM2YyMTU0MDk3YTRmMGFjZDI0NDhiZDc1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NzQxOTFiOWE3NTM0NDhkOWY3YTFiNWM1MDY4YzM3OC5iaW5kUG9wdXAocG9wdXBfYjI3ZjM5M2FhZGFiNDhkN2E3ODg1ODNjNGZkMDMxNDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDk5NDBiZDM1ZDcwNGU4M2FkNzRlOGFiNTJmOTZkOTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDQwNjIwNSw4LjUwMTQ4MDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTM0ZTcwNzZmZDZlNGMzZjgzM2VlOWU1NTY1N2Y0MDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzY2YmI0MGZiZWQ3NDgzYjlhN2IzZjhkY2EzMDcxNDEgPSAkKCc8ZGl2IGlkPSJodG1sXzM2NmJiNDBmYmVkNzQ4M2I5YTdiM2Y4ZGNhMzA3MTQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rYWV0aGlzdG9sbEBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUzNGU3MDc2ZmQ2ZTRjM2Y4MzNlZTllNTU2NTdmNDA5LnNldENvbnRlbnQoaHRtbF8zNjZiYjQwZmJlZDc0ODNiOWE3YjNmOGRjYTMwNzE0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OTk0MGJkMzVkNzA0ZTgzYWQ3NGU4YWI1MmY5NmQ5Mi5iaW5kUG9wdXAocG9wdXBfNTM0ZTcwNzZmZDZlNGMzZjgzM2VlOWU1NTY1N2Y0MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZhMmE4YWY0MmM1NGJhNGI4MjMyNWQxODI0Y2Y0ZGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTk2MDksOC41MDgwMTU2NjMxMzM5NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGIzYTJmOTFiZGU3NDNiMDhjMGI2NTFjN2EzYmNkNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIzNzJmNTkxOGVmNGNkNGEzNzhiYzEyNDJlNzc2OTEgPSAkKCc8ZGl2IGlkPSJodG1sXzUyMzcyZjU5MThlZjRjZDRhMzc4YmMxMjQyZTc3NjkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5qc2NodWNoaGFyZHRAd2llbG9jaC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGIzYTJmOTFiZGU3NDNiMDhjMGI2NTFjN2EzYmNkNGIuc2V0Q29udGVudChodG1sXzUyMzcyZjU5MThlZjRjZDRhMzc4YmMxMjQyZTc3NjkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmYTJhOGFmNDJjNTRiYTRiODIzMjVkMTgyNGNmNGRmLmJpbmRQb3B1cChwb3B1cF8wYjNhMmY5MWJkZTc0M2IwOGMwYjY1MWM3YTNiY2Q0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OWEyOGI5NDNjNWM0YzIzOTk5MDY4MGU5ZjMwYTBiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMTU5MjI5OTk5OTk5NSw4LjQ4NTU3ODcyNjQzNzY2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjY0YWYyODM2Y2Y0ZmQ3YTljZmU3MzVkNjI3MmMzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mM2YwYjNmMTkwYmQ0NWI2OGQzZDUwNjNkYmFkYWRiNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjNmMGIzZjE5MGJkNDViNjhkM2Q1MDYzZGJhZGFkYjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxlb243MEBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTI2NGFmMjgzNmNmNGZkN2E5Y2ZlNzM1ZDYyNzJjMzMuc2V0Q29udGVudChodG1sX2YzZjBiM2YxOTBiZDQ1YjY4ZDNkNTA2M2RiYWRhZGI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5YTI4Yjk0M2M1YzRjMjM5OTkwNjgwZTlmMzBhMGIzLmJpbmRQb3B1cChwb3B1cF8xMjY0YWYyODM2Y2Y0ZmQ3YTljZmU3MzVkNjI3MmMzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mY2JjYWY2NWUxOGU0OGRiOTdkNTFlNGEzZWQyN2VmYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMTU5MjI5OTk5OTk5NSw4LjQ4NTU3ODcyNjQzNzY2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWM3ZjAwMTIzMjk0MzBjOWI2ZDE4MjkyY2Q1MDQ4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Y2JjY2IxODczM2M0Zjc4ODk0MzU5NTIwNTNkNTU0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2NiY2NiMTg3MzNjNGY3ODg5NDM1OTUyMDUzZDU1NDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmdvdHRoYXJkNjRAYW9sLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NWM3ZjAwMTIzMjk0MzBjOWI2ZDE4MjkyY2Q1MDQ4Ni5zZXRDb250ZW50KGh0bWxfN2NiY2NiMTg3MzNjNGY3ODg5NDM1OTUyMDUzZDU1NDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmNiY2FmNjVlMThlNDhkYjk3ZDUxZTRhM2VkMjdlZmIuYmluZFBvcHVwKHBvcHVwXzk1YzdmMDAxMjMyOTQzMGM5YjZkMTgyOTJjZDUwNDg2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhZGE4ZjhmMTA5ODQzOWZiMGRlYTQyODVmMzIyZDNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAxMzk5NDUsOC41MDAzMTY3MjM0MTc5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZWNjNzcwMWU5ZjI0YzI3OTEyZmExMDk3MzZhYzJjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZDkwNDZkZmYxMGM0MTYxYmVmYjgyMzFjOGFmZWYxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWQ5MDQ2ZGZmMTBjNDE2MWJlZmI4MjMxYzhhZmVmMTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnZ6aXJtZUB0bHVzdGVrLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZWNjNzcwMWU5ZjI0YzI3OTEyZmExMDk3MzZhYzJjZC5zZXRDb250ZW50KGh0bWxfYWQ5MDQ2ZGZmMTBjNDE2MWJlZmI4MjMxYzhhZmVmMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmFkYThmOGYxMDk4NDM5ZmIwZGVhNDI4NWYzMjJkM2UuYmluZFBvcHVwKHBvcHVwX2FlY2M3NzAxZTlmMjRjMjc5MTJmYTEwOTczNmFjMmNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlZDYwNTg2MTkwZjQ4ZDg5Y2ZiY2U0MDk5MGM4ZWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5NDk1OCw4LjQ4NDU2ODI0NjMxMzA1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOTJmZDAyYTFmYjg0ZThiODE0MjgwOTVmNmUwMGUzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iM2RjNGQyNTc1Nzc0ZmJjODQzYTE3MmE2OTI1ZDljNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjNkYzRkMjU3NTc3NGZiYzg0M2ExNzJhNjkyNWQ5YzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnprdWhsQG1pZXMuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTJmZDAyYTFmYjg0ZThiODE0MjgwOTVmNmUwMGUzMy5zZXRDb250ZW50KGh0bWxfYjNkYzRkMjU3NTc3NGZiYzg0M2ExNzJhNjkyNWQ5YzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWVkNjA1ODYxOTBmNDhkODljZmJjZTQwOTkwYzhlZDIuYmluZFBvcHVwKHBvcHVwXzM5MmZkMDJhMWZiODRlOGI4MTQyODA5NWY2ZTAwZTMzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxYWZmMzBmNWUxYzRjYjFhM2I1NmNhZTNmOTRiOTk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5MzY5MjUsOC41MDg3ODcyNzIxMDAzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MmZkZGUwM2NhOTg0YzVmOTQ4OTlkZTIxMDYwMzY2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81YWQxMDIzMjQwZTU0NjQ3YTgxMGFjN2Q3YzkwNDg2YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWFkMTAyMzI0MGU1NDY0N2E4MTBhYzdkN2M5MDQ4NmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmhleWRyaWNoYW50b25AZWhsZXJ0LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MmZkZGUwM2NhOTg0YzVmOTQ4OTlkZTIxMDYwMzY2Ny5zZXRDb250ZW50KGh0bWxfNWFkMTAyMzI0MGU1NDY0N2E4MTBhYzdkN2M5MDQ4NmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDFhZmYzMGY1ZTFjNGNiMWEzYjU2Y2FlM2Y5NGI5OTQuYmluZFBvcHVwKHBvcHVwXzUyZmRkZTAzY2E5ODRjNWY5NDg5OWRlMjEwNjAzNjY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5YmFhODQ4YzkzMTQ5MDE5ODM4ODBhZTg1ZmJkY2UzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA1NTIxMSw4LjQ5OTA2NjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjMzYTA5MDYyOGI1NGE2MmFmNDA2MGZlMjU2MTJmNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWI2YjNlZTU3ZGY3NGE4YmEzODJmY2MzYzQ0NWZjZjkgPSAkKCc8ZGl2IGlkPSJodG1sXzViNmIzZWU1N2RmNzRhOGJhMzgyZmNjM2M0NDVmY2Y5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5kcnViaW5tYXJjZWxsYUBydXBwZXJ0Lm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjMzYTA5MDYyOGI1NGE2MmFmNDA2MGZlMjU2MTJmNmUuc2V0Q29udGVudChodG1sXzViNmIzZWU1N2RmNzRhOGJhMzgyZmNjM2M0NDVmY2Y5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5YmFhODQ4YzkzMTQ5MDE5ODM4ODBhZTg1ZmJkY2UzLmJpbmRQb3B1cChwb3B1cF9mMzNhMDkwNjI4YjU0YTYyYWY0MDYwZmUyNTYxMmY2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NTE5MWFkMzczYjg0ODJmOGNjNTllY2MwMWIzZjYyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NzY5NzMwMDAwMDAwNCw4LjUwNzE0OTcwMDAwMDAwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MTE4ZWE3NzA5OTM0MzQyOTA4Nzg5M2E5ZWNiMDlhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDJmYTJlMWZkZjU0NDIwYjExM2QyOWQ4YjBhYWNhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGQyZmEyZTFmZGY1NDQyMGIxMTNkMjlkOGIwYWFjYWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnlldHpvbGRAaGlsbGVyLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDExOGVhNzcwOTkzNDM0MjkwODc4OTNhOWVjYjA5YTAuc2V0Q29udGVudChodG1sXzRkMmZhMmUxZmRmNTQ0MjBiMTEzZDI5ZDhiMGFhY2FlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1MTkxYWQzNzNiODQ4MmY4Y2M1OWVjYzAxYjNmNjJiLmJpbmRQb3B1cChwb3B1cF80MTE4ZWE3NzA5OTM0MzQyOTA4Nzg5M2E5ZWNiMDlhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Nzc4MzRmYmNkMTM0Nzk2ODBhNWE2ODJkZmNkZWQwMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NjU0NTgsOC41MDY2Njg0MDkwNzY2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjdkNWIxY2MxNzNkNGFiODg4MTUzNGM4YmU1MWVlYmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2MxZTZkMDBjN2RmNGJiOWIwNWFmMjQ0NzUwMTMxYmYgPSAkKCc8ZGl2IGlkPSJodG1sXzNjMWU2ZDAwYzdkZjRiYjliMDVhZjI0NDc1MDEzMWJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5nb3JhbjU3QGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjdkNWIxY2MxNzNkNGFiODg4MTUzNGM4YmU1MWVlYmMuc2V0Q29udGVudChodG1sXzNjMWU2ZDAwYzdkZjRiYjliMDVhZjI0NDc1MDEzMWJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3NzgzNGZiY2QxMzQ3OTY4MGE1YTY4MmRmY2RlZDAzLmJpbmRQb3B1cChwb3B1cF82N2Q1YjFjYzE3M2Q0YWI4ODgxNTM0YzhiZTUxZWViYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xODYwZTk5M2QxZjU0NDI3YmM1NzcyMWIwZDc3NjYxZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjU5MDI1LDguNDkyNDYzNTQ2MzI5Mjg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0OWZhODE1MmU2MTQzNjJhY2NmNjgzY2FhZGU5ZTRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkZTkyNjdmNjZiODQ2MTQ5ZWFlNTc5NDcwMDYwMDc3ID0gJCgnPGRpdiBpZD0iaHRtbF8zZGU5MjY3ZjY2Yjg0NjE0OWVhZTU3OTQ3MDA2MDA3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a2xhdWRpYWhhcnRtYW5uQGd1dGtuZWNodC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0OWZhODE1MmU2MTQzNjJhY2NmNjgzY2FhZGU5ZTRmLnNldENvbnRlbnQoaHRtbF8zZGU5MjY3ZjY2Yjg0NjE0OWVhZTU3OTQ3MDA2MDA3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODYwZTk5M2QxZjU0NDI3YmM1NzcyMWIwZDc3NjYxZC5iaW5kUG9wdXAocG9wdXBfZTQ5ZmE4MTUyZTYxNDM2MmFjY2Y2ODNjYWFkZTllNGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2RmZDJlMzFlMzYwNDBkNWFmMTNkMjRmNzI2ZGVjY2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTg1MTU3NSw4LjUwODM2Mjk3MDk1Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3MmZmNDRjZmY1NzRlZTA4ZWU2ZmQ4YjAyMWJmNjdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwYjM4MTNiMDdlNDQxZDI5MmI3NDY1MjVhOGU3NTA0ID0gJCgnPGRpdiBpZD0iaHRtbF8zMGIzODEzYjA3ZTQ0MWQyOTJiNzQ2NTI1YThlNzUwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+a2Flc3RlcmhlbGdhQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzJmZjQ0Y2ZmNTc0ZWUwOGVlNmZkOGIwMjFiZjY3Yi5zZXRDb250ZW50KGh0bWxfMzBiMzgxM2IwN2U0NDFkMjkyYjc0NjUyNWE4ZTc1MDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2RmZDJlMzFlMzYwNDBkNWFmMTNkMjRmNzI2ZGVjY2UuYmluZFBvcHVwKHBvcHVwXzg3MmZmNDRjZmY1NzRlZTA4ZWU2ZmQ4YjAyMWJmNjdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxNGE2NjQ4MjAzODRmYzBhMWM0YmJiM2Y2NjVjYzQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5OTI2OSw4LjQ4MjE1NjIwMTM2NjExM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NDMzYmM1YWFiMTM0MzBlYmVjNzg2NWQ3NDI1ZDFjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzA3NTM1OGY4ZjY0YjcyYWQyMWNiNDBkNjU1NGMzNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjMwNzUzNThmOGY2NGI3MmFkMjFjYjQwZDY1NTRjMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0b2xsc3RqZXBhbkB1bGxyaWNoLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDMzYmM1YWFiMTM0MzBlYmVjNzg2NWQ3NDI1ZDFjMi5zZXRDb250ZW50KGh0bWxfNjMwNzUzNThmOGY2NGI3MmFkMjFjYjQwZDY1NTRjMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTE0YTY2NDgyMDM4NGZjMGExYzRiYmIzZjY2NWNjNDEuYmluZFBvcHVwKHBvcHVwXzc0MzNiYzVhYWIxMzQzMGViZWM3ODY1ZDc0MjVkMWMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2M2MyMDY0NmQyYzRkOGJiNzM0YzdlOWM0NmUzMTE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNDExMyw4LjQ5NzYyODUwOTk3ODE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZjY4ZmI1OWQ3MmU0NjY1ODFkZWJkYmQ1OTNkNTAxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZmNkZWY4ZmEyMDE0YmRlOGNlOTNjYjgyMDQxMWQxMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNmZjZGVmOGZhMjAxNGJkZThjZTkzY2I4MjA0MTFkMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFsZXhlaWhvbHN0ZW5Ad2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjY4ZmI1OWQ3MmU0NjY1ODFkZWJkYmQ1OTNkNTAxNy5zZXRDb250ZW50KGh0bWxfNmZjZGVmOGZhMjAxNGJkZThjZTkzY2I4MjA0MTFkMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDYzYzIwNjQ2ZDJjNGQ4YmI3MzRjN2U5YzQ2ZTMxMTkuYmluZFBvcHVwKHBvcHVwXzBmNjhmYjU5ZDcyZTQ2NjU4MWRlYmRiZDU5M2Q1MDE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlYTY2MjgyMmE1ZjQ2YzA4ZGVlY2U4NjQ2YmI0NTA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE0NDc2MjUsOC40Nzk1NDYxMzAxNjk2ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDVlYzYxMThkMDgxNDQ0N2EyYjUzYWNhMDczNGQ0OGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzk4MmYzMzlmYTY5NDQ2N2E4YTVjZmY4OWNkZjU1ZjYgPSAkKCc8ZGl2IGlkPSJodG1sXzM5ODJmMzM5ZmE2OTQ0NjdhOGE1Y2ZmODljZGY1NWY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rcGV1a2VydEBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1ZWM2MTE4ZDA4MTQ0NDdhMmI1M2FjYTA3MzRkNDhmLnNldENvbnRlbnQoaHRtbF8zOTgyZjMzOWZhNjk0NDY3YThhNWNmZjg5Y2RmNTVmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZWE2NjI4MjJhNWY0NmMwOGRlZWNlODY0NmJiNDUwOS5iaW5kUG9wdXAocG9wdXBfZDVlYzYxMThkMDgxNDQ0N2EyYjUzYWNhMDczNGQ0OGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTE3YWRmZmU5MWFhNDM5ZThiYzU3ZDY0ZWI3YjBhMjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY4NDQwNTAwMDAwMDQsOC40Nzg4MTI5MTE0NTU5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDFkNzhhM2NlNmNmNDQ1YWEzZjFiYzk0ODkwYTNmMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTBmMzRmZTUxNWU1NDVkZTk1ODA1OTkxZmUyYjUwMjggPSAkKCc8ZGl2IGlkPSJodG1sXzUwZjM0ZmU1MTVlNTQ1ZGU5NTgwNTk5MWZlMmI1MDI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5nZW9yZ2lvc3NjaGxlaWNoQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDFkNzhhM2NlNmNmNDQ1YWEzZjFiYzk0ODkwYTNmMzMuc2V0Q29udGVudChodG1sXzUwZjM0ZmU1MTVlNTQ1ZGU5NTgwNTk5MWZlMmI1MDI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UxN2FkZmZlOTFhYTQzOWU4YmM1N2Q2NGViN2IwYTI0LmJpbmRQb3B1cChwb3B1cF9kMWQ3OGEzY2U2Y2Y0NDVhYTNmMWJjOTQ4OTBhM2YzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2Y3YTUzNGRlM2Q0NjVhOTNiYzA0YzY5ZmU4NGE1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNTgyNzksOC40ODEwNDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxMWU5MjRkYTVlMDQwMTc4ODdlMDhkYTBlMGQwNzQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZlNmZhOTVkZjYxNTQ3ZDg4NzdkMzU3ZmJhZGZmNGIxID0gJCgnPGRpdiBpZD0iaHRtbF82ZTZmYTk1ZGY2MTU0N2Q4ODc3ZDM1N2ZiYWRmZjRiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGFlcmluZ2FsaWNlQGhvdG1haWwuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQxMWU5MjRkYTVlMDQwMTc4ODdlMDhkYTBlMGQwNzQ2LnNldENvbnRlbnQoaHRtbF82ZTZmYTk1ZGY2MTU0N2Q4ODc3ZDM1N2ZiYWRmZjRiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wM2Y3YTUzNGRlM2Q0NjVhOTNiYzA0YzY5ZmU4NGE1Ny5iaW5kUG9wdXAocG9wdXBfNDExZTkyNGRhNWUwNDAxNzg4N2UwOGRhMGUwZDA3NDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTI5NjI1MmJmMzMwNDk1MmExYWVkZGJmZGQ5MmI5MjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIwNjYzNSw4LjQ5MjkzMjI1MTA1ODY4M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZmEzZGRjYmYxZDE0ZTY1OWMwMjczYWIyMzIxNDgwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYzMxMzY4MzBiYzY0MmVlYTdmYTYwN2I4YTJhMjVmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmMzMTM2ODMwYmM2NDJlZWE3ZmE2MDdiOGEyYTI1ZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1hcml1c3o1NkBrcmVpbi5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmYTNkZGNiZjFkMTRlNjU5YzAyNzNhYjIzMjE0ODBmLnNldENvbnRlbnQoaHRtbF8yYzMxMzY4MzBiYzY0MmVlYTdmYTYwN2I4YTJhMjVmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjk2MjUyYmYzMzA0OTUyYTFhZWRkYmZkZDkyYjkyNy5iaW5kUG9wdXAocG9wdXBfN2ZhM2RkY2JmMWQxNGU2NTljMDI3M2FiMjMyMTQ4MGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2EzYzRiYjJhZWU2NGI4YmJkZTNjN2IwZjZhZTFkMzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTk2NzAyLDguNTAyMzQ3MzQ4Mjk2NjEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhODYxYjgzMGY1YTQ3MGJiZDVkMzA0ZmFhNzA2ODY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3M2QxYTdlMWY2MzRkMjA5NzQ0ZWM3YTBkMDM1YWE4ID0gJCgnPGRpdiBpZD0iaHRtbF8xNzNkMWE3ZTFmNjM0ZDIwOTc0NGVjN2EwZDAzNWFhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c3RldmUzNUBwbGF0aC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhODYxYjgzMGY1YTQ3MGJiZDVkMzA0ZmFhNzA2ODY5LnNldENvbnRlbnQoaHRtbF8xNzNkMWE3ZTFmNjM0ZDIwOTc0NGVjN2EwZDAzNWFhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YTNjNGJiMmFlZTY0YjhiYmRlM2M3YjBmNmFlMWQzNC5iaW5kUG9wdXAocG9wdXBfYmE4NjFiODMwZjVhNDcwYmJkNWQzMDRmYWE3MDY4NjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjJiNjg4YzQxM2Q4NGQ0NjgwMGE5MDU0NzdmOWQ3NzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIwMjg0NSw4LjUwMzkzMjc5OTYyNzEzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODE2MDk3YTdhZDY0ZDNlYjU2MTc5Njk1MmQ4YjUwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzI4NzZmN2JmY2I0MTMyOTYxNzg3OTg1YWM1Y2FiYyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWMyODc2ZjdiZmNiNDEzMjk2MTc4Nzk4NWFjNWNhYmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnFiZW5kZXJAd2Vpc3Mub3JnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODE2MDk3YTdhZDY0ZDNlYjU2MTc5Njk1MmQ4YjUwYS5zZXRDb250ZW50KGh0bWxfZWMyODc2ZjdiZmNiNDEzMjk2MTc4Nzk4NWFjNWNhYmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjJiNjg4YzQxM2Q4NGQ0NjgwMGE5MDU0NzdmOWQ3NzguYmluZFBvcHVwKHBvcHVwXzM4MTYwOTdhN2FkNjRkM2ViNTYxNzk2OTUyZDhiNTBhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwYjE1M2QzMTVkOTRiM2E4YmQ0YmM3MGIzZTc4ZDE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5MjIyMDUsOC40ODQ4MDY0NTc2NDUxNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWE1MGIzYTE1MGI5NGQ0YTkxZmQzMjcyMjc4ZjU0MDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ4MDViMjI2YTY4NDJlZGE3MzE2YjQxZDA5N2E1MGUgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ODA1YjIyNmE2ODQyZWRhNzMxNmI0MWQwOTdhNTBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5laHJlbmZyaWVkMjhAaG9sdC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWE1MGIzYTE1MGI5NGQ0YTkxZmQzMjcyMjc4ZjU0MDQuc2V0Q29udGVudChodG1sXzU0ODA1YjIyNmE2ODQyZWRhNzMxNmI0MWQwOTdhNTBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwYjE1M2QzMTVkOTRiM2E4YmQ0YmM3MGIzZTc4ZDE2LmJpbmRQb3B1cChwb3B1cF85YTUwYjNhMTUwYjk0ZDRhOTFmZDMyNzIyNzhmNTQwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YjYxZjI5YTY3Mzg0NDQ5ODdjMzU1Mjg5OTZmNzVmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjg0NDA1MDAwMDAwNCw4LjQ3ODgxMjkxMTQ1NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYmJlZWI4N2NjZTQ0NGFmOGY1MmZlNDE2ODc2MGVjNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTdiNmMyMGQ5YmI0YzEyOTRhOTNlMzdkYTMzYTQ1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDU3YjZjMjBkOWJiNGMxMjk0YTkzZTM3ZGEzM2E0NTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxpZGlhMDhAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYmJlZWI4N2NjZTQ0NGFmOGY1MmZlNDE2ODc2MGVjNS5zZXRDb250ZW50KGh0bWxfZDU3YjZjMjBkOWJiNGMxMjk0YTkzZTM3ZGEzM2E0NTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGI2MWYyOWE2NzM4NDQ0OTg3YzM1NTI4OTk2Zjc1ZjAuYmluZFBvcHVwKHBvcHVwXzNiYmVlYjg3Y2NlNDQ0YWY4ZjUyZmU0MTY4NzYwZWM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyZjQ5NzMxNWFhYTRkOTc5NzI5ODI5OWJiNTIxMjZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5OTI2OSw4LjQ4MjE1NjIwMTM2NjExM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjY4YmJjYjE4YmU0OWY2YTBkNWY0OWY1MDI0NDhjYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNjAyYmIxZjIwNTk0Mjk4OTM5YzA4ZDdlMjA1YjczYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjYwMmJiMWYyMDU5NDI5ODkzOWMwOGQ3ZTIwNWI3M2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnRyYXV0ZTQ1QGhlc3NlLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY2OGJiY2IxOGJlNDlmNmEwZDVmNDlmNTAyNDQ4Y2Euc2V0Q29udGVudChodG1sXzI2MDJiYjFmMjA1OTQyOTg5MzljMDhkN2UyMDViNzNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyZjQ5NzMxNWFhYTRkOTc5NzI5ODI5OWJiNTIxMjZiLmJpbmRQb3B1cChwb3B1cF8xNjY4YmJjYjE4YmU0OWY2YTBkNWY0OWY1MDI0NDhjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZGViMmNlMmZhZmM0MjlmYTZmN2RjM2U2YmFlNWQzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NzU1MDk0OTk5OTk5Niw4LjUxMjk0MDQ4NTk3NDIwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNmRiMTU4ZDJhMDQ0ZDZkODc5OGM3MGNjODhkNGJmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjUzZGRlOTVmN2Y0YzY5OTMyNjhmOTA1Mzk3ZGZlZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTI1M2RkZTk1ZjdmNGM2OTkzMjY4ZjkwNTM5N2RmZWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnN0YWhyaGlsZGVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNmRiMTU4ZDJhMDQ0ZDZkODc5OGM3MGNjODhkNGJmYS5zZXRDb250ZW50KGh0bWxfOTI1M2RkZTk1ZjdmNGM2OTkzMjY4ZjkwNTM5N2RmZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGRlYjJjZTJmYWZjNDI5ZmE2ZjdkYzNlNmJhZTVkM2QuYmluZFBvcHVwKHBvcHVwXzI2ZGIxNThkMmEwNDRkNmQ4Nzk4YzcwY2M4OGQ0YmZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlMGMyZGIyY2VlMjQxMWNhMmM1NzBkOTExMTZlNDg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA0MDQ5LDguNTAwNzYzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzliYTg4OTIxMWM0NDFjOWFjN2ZmMWMzMjdmMWYwMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmNlODE1MzFiMzc0ZTUyYmIyNjJiN2FmNGFkOGU0MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJjZTgxNTMxYjM3NGU1MmJiMjYyYjdhZjRhZDhlNDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndhbGx5NzNAaGV5ZHJpY2guY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzliYTg4OTIxMWM0NDFjOWFjN2ZmMWMzMjdmMWYwMC5zZXRDb250ZW50KGh0bWxfYmJjZTgxNTMxYjM3NGU1MmJiMjYyYjdhZjRhZDhlNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmUwYzJkYjJjZWUyNDExY2EyYzU3MGQ5MTExNmU0ODQuYmluZFBvcHVwKHBvcHVwXzA3OWJhODg5MjExYzQ0MWM5YWM3ZmYxYzMyN2YxZjAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkMTBiMjY5NTJlMjQ4OGU5OGU0N2I1MzgzMzIwMjdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzNTcyOSw4LjQ5ODYyNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWEyM2ZhYmU0MTQ2NGEzMWE5MTRiY2FiMjFmMWI4NDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUxZTA1ZWE5OTI5NDI1NmEwNDc1ZTI4Y2M2NjkwMWEgPSAkKCc8ZGl2IGlkPSJodG1sX2M1MWUwNWVhOTkyOTQyNTZhMDQ3NWUyOGNjNjY5MDFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij56cm9nZ2VAa2Fyei5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhMjNmYWJlNDE0NjRhMzFhOTE0YmNhYjIxZjFiODQzLnNldENvbnRlbnQoaHRtbF9jNTFlMDVlYTk5Mjk0MjU2YTA0NzVlMjhjYzY2OTAxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZDEwYjI2OTUyZTI0ODhlOThlNDdiNTM4MzMyMDI3ZC5iaW5kUG9wdXAocG9wdXBfMWEyM2ZhYmU0MTQ2NGEzMWE5MTRiY2FiMjFmMWI4NDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQ4NDU3YzZhYjVkNDg1ODhkYjhkNWIyMzJhZTYzNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDk5MjY5LDguNDgyMTU2MjAxMzY2MTEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3M2ZlMzg5OTFlYzQ3M2RhODhhODNkYjI1ZjU2ZDk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5ZmYwMzc5MzcwYzQ3OTk4MGVjN2M0ZDI5YjM0N2IyID0gJCgnPGRpdiBpZD0iaHRtbF81OWZmMDM3OTM3MGM0Nzk5ODBlYzdjNGQyOWIzNDdiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aXJtYXNjaGVpYmVAc2Nod2l0YWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNzNmZTM4OTkxZWM0NzNkYTg4YTgzZGIyNWY1NmQ5Ny5zZXRDb250ZW50KGh0bWxfNTlmZjAzNzkzNzBjNDc5OTgwZWM3YzRkMjliMzQ3YjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzQ4NDU3YzZhYjVkNDg1ODhkYjhkNWIyMzJhZTYzNjEuYmluZFBvcHVwKHBvcHVwXzM3M2ZlMzg5OTFlYzQ3M2RhODhhODNkYjI1ZjU2ZDk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyYWIwZjdmNWY1YTQ2ODQ5YTNkNzNmOTZhODllODU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA5OTI2OSw4LjQ4MjE1NjIwMTM2NjExM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYWI1MDU4NWJiNDk0Y2Y2ODRiNzljYWY4OGE1MThiMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDM2Y2ZjOGZkOTE0OTlmOGE1Y2Q3MDBiNjBhYWNjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQzNmNmYzhmZDkxNDk5ZjhhNWNkNzAwYjYwYWFjY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnpvcmJhY2hrYXJsLWZyaWVkcmljaEB0bHVzdGVrLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYWI1MDU4NWJiNDk0Y2Y2ODRiNzljYWY4OGE1MThiMy5zZXRDb250ZW50KGh0bWxfZjQzNmNmYzhmZDkxNDk5ZjhhNWNkNzAwYjYwYWFjY2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjJhYjBmN2Y1ZjVhNDY4NDlhM2Q3M2Y5NmE4OWU4NTcuYmluZFBvcHVwKHBvcHVwX2VhYjUwNTg1YmI0OTRjZjY4NGI3OWNhZjg4YTUxOGIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlMDQzMjU5YTIyNTQ0ZDNiZjVjYTkxZDgyNWM2YzlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk1OTE1ODUsOC41MDM4MTQ3OTYyODU3OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTRmYmE1OGU3MzYyNDM1NjhjMTdmMmNlYjIyNWZhZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTVkMWUxZGJjYzBlNDg0OTkwYjFmYWVjZTU4M2Q1MjYgPSAkKCc8ZGl2IGlkPSJodG1sXzE1ZDFlMWRiY2MwZTQ4NDk5MGIxZmFlY2U1ODNkNTI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5oZWluei1nZW9yZ3BvZWxpdHpAZmllYmlnLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTRmYmE1OGU3MzYyNDM1NjhjMTdmMmNlYjIyNWZhZjQuc2V0Q29udGVudChodG1sXzE1ZDFlMWRiY2MwZTQ4NDk5MGIxZmFlY2U1ODNkNTI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlMDQzMjU5YTIyNTQ0ZDNiZjVjYTkxZDgyNWM2YzlmLmJpbmRQb3B1cChwb3B1cF9lNGZiYTU4ZTczNjI0MzU2OGMxN2YyY2ViMjI1ZmFmNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYWJlZWNiZTRkOWE0ODIyOTRhMjE4Y2Y3ZDAzMTdkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDE2OTIsOC40OTQyNzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0MDg1Y2JjZjNkNDQxNmM4ODgyYWI5NTczMDc1YThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQzZWE0YTFkYzQ3MDQ3OTc5MzA2OGMzZWNjMTc1M2M5ID0gJCgnPGRpdiBpZD0iaHRtbF80M2VhNGExZGM0NzA0Nzk3OTMwNjhjM2VjYzE3NTNjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2llc2VsYTExQGpvaGFubi5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0MDg1Y2JjZjNkNDQxNmM4ODgyYWI5NTczMDc1YThlLnNldENvbnRlbnQoaHRtbF80M2VhNGExZGM0NzA0Nzk3OTMwNjhjM2VjYzE3NTNjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYWJlZWNiZTRkOWE0ODIyOTRhMjE4Y2Y3ZDAzMTdkMS5iaW5kUG9wdXAocG9wdXBfMzQwODVjYmNmM2Q0NDE2Yzg4ODJhYjk1NzMwNzVhOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTA3M2EzOTJlOTFjNGQ4NGFlMWI0OTViMjRjNTIzNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTM5MzYyLDguNDc3ODI0NDI5NDc1NDY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzN2RhN2Q4OGEzZTQzOTQ4NjI4ZWE2NDM3NmZjMDI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxN2U0ZTQ3YTkxODRjZjg5OTMxODJhNmJkMzk4NzRiID0gJCgnPGRpdiBpZD0iaHRtbF9mMTdlNGU0N2E5MTg0Y2Y4OTkzMTgyYTZiZDM5ODc0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Y2FtaWxsYXJ1ZG9scGhAamVzc2VsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTM3ZGE3ZDg4YTNlNDM5NDg2MjhlYTY0Mzc2ZmMwMjYuc2V0Q29udGVudChodG1sX2YxN2U0ZTQ3YTkxODRjZjg5OTMxODJhNmJkMzk4NzRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwNzNhMzkyZTkxYzRkODRhZTFiNDk1YjI0YzUyMzYxLmJpbmRQb3B1cChwb3B1cF9lMzdkYTdkODhhM2U0Mzk0ODYyOGVhNjQzNzZmYzAyNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODZkMmM0YjZjMmI0YTJhYjE1ZjljNzEwNjA4NTU0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMDE2OTIsOC40OTQyNzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkMzI1MTg4NjM2MzRiMzQ4MDE5ZmQ2NTFmYzVmMTUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M2MTYzOGYxZDg0NDQ5ODg5NzJkYTc0MjEwOTNmMDRlID0gJCgnPGRpdiBpZD0iaHRtbF9jNjE2MzhmMWQ4NDQ0OTg4OTcyZGE3NDIxMDkzZjA0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z2lzYmVydHNjaGxlaWNoQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDMyNTE4ODYzNjM0YjM0ODAxOWZkNjUxZmM1ZjE1MC5zZXRDb250ZW50KGh0bWxfYzYxNjM4ZjFkODQ0NDk4ODk3MmRhNzQyMTA5M2YwNGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjg2ZDJjNGI2YzJiNGEyYWIxNWY5YzcxMDYwODU1NDYuYmluZFBvcHVwKHBvcHVwXzlkMzI1MTg4NjM2MzRiMzQ4MDE5ZmQ2NTFmYzVmMTUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMzhkMDdkMWZlMzQzZmZiN2NhY2U4MDE4MGZhOGIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2OTg2MDUsOC40OTQwOTY0MzU2NjMwODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWU2NTMyYTkzNDE3NGIyMjg5NTcyNTRjODkwZjYyY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTBjMjI1OTFkOGM5NGFhMzlkMjc4ZGY4NTgzOWFlNzkgPSAkKCc8ZGl2IGlkPSJodG1sXzEwYzIyNTkxZDhjOTRhYTM5ZDI3OGRmODU4MzlhZTc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij55d2VpbmhhZ2VAYmVpZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVlNjUzMmE5MzQxNzRiMjI4OTU3MjU0Yzg5MGY2MmNjLnNldENvbnRlbnQoaHRtbF8xMGMyMjU5MWQ4Yzk0YWEzOWQyNzhkZjg1ODM5YWU3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZDM4ZDA3ZDFmZTM0M2ZmYjdjYWNlODAxODBmYThiMi5iaW5kUG9wdXAocG9wdXBfNWU2NTMyYTkzNDE3NGIyMjg5NTcyNTRjODkwZjYyY2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTI1NzdhMzBiYTI2NDA2Mjg2NTA1NDY3ZmMxNjA0NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kODg3YjczMDJkMTg0Njc3OGEwYzgxMTMyY2E0MDU3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTBjN2M0ZDdhY2E0MTMwYjg4ZGQ4ODE3ZWY5MGEwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTkwYzdjNGQ3YWNhNDEzMGI4OGRkODgxN2VmOTBhMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmV2ZWx5bmVsb2VmZmxlckBwYWVydHplbHQuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4ODdiNzMwMmQxODQ2Nzc4YTBjODExMzJjYTQwNTc0LnNldENvbnRlbnQoaHRtbF8xOTBjN2M0ZDdhY2E0MTMwYjg4ZGQ4ODE3ZWY5MGEwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjU3N2EzMGJhMjY0MDYyODY1MDU0NjdmYzE2MDQ1OS5iaW5kUG9wdXAocG9wdXBfZDg4N2I3MzAyZDE4NDY3NzhhMGM4MTEzMmNhNDA1NzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjhmMGQyNmM4NDI2NDk5MDk4ZjBlMzEyZDA1ZGIxZTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTY3MzYzLDguNTEwNjAwODI0Mjg2MzUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2ZmM0NDE3OWNiNjQ4M2I5MzBmODMzNDEzNzE1ZTZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiODIwMTQ2MjAwODRkNTZiOTdjNzBjY2M5NTYzNWUyID0gJCgnPGRpdiBpZD0iaHRtbF8yYjgyMDE0NjIwMDg0ZDU2Yjk3YzcwY2NjOTU2MzVlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZmFiaWFudHJ1YkBnZXJsYWNoLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTZmYzQ0MTc5Y2I2NDgzYjkzMGY4MzM0MTM3MTVlNmUuc2V0Q29udGVudChodG1sXzJiODIwMTQ2MjAwODRkNTZiOTdjNzBjY2M5NTYzNWUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4ZjBkMjZjODQyNjQ5OTA5OGYwZTMxMmQwNWRiMWUzLmJpbmRQb3B1cChwb3B1cF81NmZjNDQxNzljYjY0ODNiOTMwZjgzMzQxMzcxNWU2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85M2JiMzEyODE3YTI0NzRjYjI1MzFjN2Q4ZjZiODJmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NTcyODgsOC41MDczNTYwMDE3Mzk4NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWRiYjA3MTFmMjFmNDc5ZWE2ZGQ2OTM3OGU3ZTA0NjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2JiN2VhMzM0MjY4NGM1NjhmYzI2ZGI3MGUzM2JmODQgPSAkKCc8ZGl2IGlkPSJodG1sX2NiYjdlYTMzNDI2ODRjNTY4ZmMyNmRiNzBlMzNiZjg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ib2xuYmFjaGVkaXRoYUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZGJiMDcxMWYyMWY0NzllYTZkZDY5Mzc4ZTdlMDQ2Mi5zZXRDb250ZW50KGh0bWxfY2JiN2VhMzM0MjY4NGM1NjhmYzI2ZGI3MGUzM2JmODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTNiYjMxMjgxN2EyNDc0Y2IyNTMxYzdkOGY2YjgyZjcuYmluZFBvcHVwKHBvcHVwXzFkYmIwNzExZjIxZjQ3OWVhNmRkNjkzNzhlN2UwNDYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzOThiNzM1N2I0NTQ1MTJhNjkzNTJmMDEzYmU4MjFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2NjA0MTUsOC41MDg4MjUwNDAxNDc5MjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzFkMmVkNjZmM2MxNGU2OWFjODFjMGNlNTQ5MzZmYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTdhMGFmYzk5ODUyNGYwMWJiMWJlZjVkMWMyODNiMWUgPSAkKCc8ZGl2IGlkPSJodG1sX2E3YTBhZmM5OTg1MjRmMDFiYjFiZWY1ZDFjMjgzYjFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5tZWlzdGVyb2xpdmVyQHNjaGVuay5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MxZDJlZDY2ZjNjMTRlNjlhYzgxYzBjZTU0OTM2ZmEwLnNldENvbnRlbnQoaHRtbF9hN2EwYWZjOTk4NTI0ZjAxYmIxYmVmNWQxYzI4M2IxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Mzk4YjczNTdiNDU0NTEyYTY5MzUyZjAxM2JlODIxZi5iaW5kUG9wdXAocG9wdXBfYzFkMmVkNjZmM2MxNGU2OWFjODFjMGNlNTQ5MzZmYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2M4ZDI2ZTdjYTZmNGU3Mjg0NTNhMGY0ZDk4MWZiOGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDIzNjQyLDguNDkzODgwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDZiMGQ2ZThlODM0NTY2ODVkYjc3YjE5MjI4NDExMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMDQxZGVkNDcwMWI0MGFjYjE3NGU3ODc5NzZjZTEwYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjA0MWRlZDQ3MDFiNDBhY2IxNzRlNzg3OTc2Y2UxMGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndhbGJ1cmdhamFjb2JAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDZiMGQ2ZThlODM0NTY2ODVkYjc3YjE5MjI4NDExMi5zZXRDb250ZW50KGh0bWxfYjA0MWRlZDQ3MDFiNDBhY2IxNzRlNzg3OTc2Y2UxMGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2M4ZDI2ZTdjYTZmNGU3Mjg0NTNhMGY0ZDk4MWZiOGUuYmluZFBvcHVwKHBvcHVwXzZkNmIwZDZlOGU4MzQ1NjY4NWRiNzdiMTkyMjg0MTEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyOTRjMGJiMTNmZDRlM2Y4NmU4MWVkMTYxNDc2NjgzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk3Mjk3Niw4LjUwNzkwNjIwMzIxOTE3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lODhmM2MxN2IwMjA0OGNmYjY4NTYyMjFkMmNlOTZhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDllMjI4ZDBmYmE0ZTYzODRkNWM0MTczOWNjYmYzMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQ5ZTIyOGQwZmJhNGU2Mzg0ZDVjNDE3MzljY2JmMzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNzdGV5QGdtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTg4ZjNjMTdiMDIwNDhjZmI2ODU2MjIxZDJjZTk2YWEuc2V0Q29udGVudChodG1sXzVkOWUyMjhkMGZiYTRlNjM4NGQ1YzQxNzM5Y2NiZjMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyOTRjMGJiMTNmZDRlM2Y4NmU4MWVkMTYxNDc2NjgzLmJpbmRQb3B1cChwb3B1cF9lODhmM2MxN2IwMjA0OGNmYjY4NTYyMjFkMmNlOTZhYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjcyM2UxM2UyN2Y0YzQzOTExMjYzZTA3NTkyZmIyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzMzOTQsOC41MDIwNTI5MDc5NDY1NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE2MWJkODk2NTRiNDhmZjkzYTBlYzc3ZTg5NjNlMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmIxYjRhZjFiNjY5NGJjZmFlNGY4MzBmNzZjODMyOTkgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiMWI0YWYxYjY2OTRiY2ZhZTRmODMwZjc2YzgzMjk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53ZXJuZXJtYXJrQG1lbnR6ZWwubmV0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYTYxYmQ4OTY1NGI0OGZmOTNhMGVjNzdlODk2M2UwNi5zZXRDb250ZW50KGh0bWxfZmIxYjRhZjFiNjY5NGJjZmFlNGY4MzBmNzZjODMyOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDI3MjNlMTNlMjdmNGM0MzkxMTI2M2UwNzU5MmZiMmMuYmluZFBvcHVwKHBvcHVwX2VhNjFiZDg5NjU0YjQ4ZmY5M2EwZWM3N2U4OTYzZTA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI1OTgzMjUwMjdkNTQ1NDc5YmIxYTNlNDEyYTAzMDBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzNDg5OSw4LjQ3OTIxNjIzNDg5MjI5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2Y3NzlkNGYyMDU0MjA5ODQ4MjU1ZTU1NGU0YTljYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWE2ZWZiYzk3ZTc0MjcyYTc5NmRlN2RkNjcyZDIwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDlhNmVmYmM5N2U3NDI3MmE3OTZkZTdkZDY3MmQyMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJoYXJ0bWFubkByaW5nLm5ldDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdmNzc5ZDRmMjA1NDIwOTg0ODI1NWU1NTRlNGE5Y2Muc2V0Q29udGVudChodG1sXzQ5YTZlZmJjOTdlNzQyNzJhNzk2ZGU3ZGQ2NzJkMjA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1OTgzMjUwMjdkNTQ1NDc5YmIxYTNlNDEyYTAzMDBlLmJpbmRQb3B1cChwb3B1cF8xN2Y3NzlkNGYyMDU0MjA5ODQ4MjU1ZTU1NGU0YTljYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZTJkM2Q3Y2YyYjU0OTU0OTI5YzA1NTQyNmUzMzEyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5ODA5NDA1LDguNTA2NDIxMDE4MjcwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3MTBhNmZiZmIxZTQyMWY5NTYxM2ZhZWIzOTM2Y2M1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjYmVjMTkyOWIzZTRmODg5NWE3NjM4MjI3N2Y1OWQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9hY2JlYzE5MjliM2U0Zjg4OTVhNzYzODIyNzdmNTlkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZmJpbm5lckBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NzEwYTZmYmZiMWU0MjFmOTU2MTNmYWViMzkzNmNjNS5zZXRDb250ZW50KGh0bWxfYWNiZWMxOTI5YjNlNGY4ODk1YTc2MzgyMjc3ZjU5ZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2UyZDNkN2NmMmI1NDk1NDkyOWMwNTU0MjZlMzMxMmUuYmluZFBvcHVwKHBvcHVwXzY3MTBhNmZiZmIxZTQyMWY5NTYxM2ZhZWIzOTM2Y2M1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE2ZjY2MWY4ODMwNDQ1MGJhMjI5ZmVjOGIxNzg4MTQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA2NTY5OCw4LjQ5MTg1MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTk5YTBiOGZiNDVmNDIwYWE0MjRkYTAwZjYxZmI2ZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNlOGM0NmYwZTU1NDAzYWJmYmRjMGE4MTFmMTVjMTggPSAkKCc8ZGl2IGlkPSJodG1sX2QzZThjNDZmMGU1NTQwM2FiZmJkYzBhODExZjE1YzE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zY2h1ZWxlcnJvbmFsZEBuYXNlci5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5OWEwYjhmYjQ1ZjQyMGFhNDI0ZGEwMGY2MWZiNmRiLnNldENvbnRlbnQoaHRtbF9kM2U4YzQ2ZjBlNTU0MDNhYmZiZGMwYTgxMWYxNWMxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNmY2NjFmODgzMDQ0NTBiYTIyOWZlYzhiMTc4ODE0OC5iaW5kUG9wdXAocG9wdXBfNTk5YTBiOGZiNDVmNDIwYWE0MjRkYTAwZjYxZmI2ZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDlkYjUyNDE2Y2ZmNGNiYWE0MmI0OTk5Y2ZmZmNjNTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDY3ODUxNTAwMDAwMDUsOC40ODk5NTEyMTAzNDUzNDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjM1MmRhZWUyODI2NDJlYjk5MTE2OTExNTgwZjg5ZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWVhMGNkM2QxNDk2NGMxMmJlNTNkNzM3MDMyZDU4YzggPSAkKCc8ZGl2IGlkPSJodG1sX2FlYTBjZDNkMTQ5NjRjMTJiZTUzZDczNzAzMmQ1OGM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5naWVyc2NobmVyYWxmcmVkb0Bnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjM1MmRhZWUyODI2NDJlYjk5MTE2OTExNTgwZjg5ZDEuc2V0Q29udGVudChodG1sX2FlYTBjZDNkMTQ5NjRjMTJiZTUzZDczNzAzMmQ1OGM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5ZGI1MjQxNmNmZjRjYmFhNDJiNDk5OWNmZmZjYzU5LmJpbmRQb3B1cChwb3B1cF8yMzUyZGFlZTI4MjY0MmViOTkxMTY5MTE1ODBmODlkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNzQwMTUwZDlhYjU0OTU4OWQ2MjEyNzJhZGMzODVmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNjcyNCw4LjQ5NTYzNDA2MzIzNDYwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzQ0ZmEzMjE2NTA0ZjM0YjVhZDAzNTNiMWY2MmIwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81Yjc4NTlhZDRlOGY0NjMyYTdjOWRjZWEwZTZkOTRiNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWI3ODU5YWQ0ZThmNDYzMmE3YzlkY2VhMGU2ZDk0YjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmlzYWJlbGxhNTNAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTM0NGZhMzIxNjUwNGYzNGI1YWQwMzUzYjFmNjJiMDEuc2V0Q29udGVudChodG1sXzViNzg1OWFkNGU4ZjQ2MzJhN2M5ZGNlYTBlNmQ5NGI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I3NDAxNTBkOWFiNTQ5NTg5ZDYyMTI3MmFkYzM4NWZhLmJpbmRQb3B1cChwb3B1cF9lMzQ0ZmEzMjE2NTA0ZjM0YjVhZDAzNTNiMWY2MmIwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDk1OWFiYjAxZTY0NTRlYTQ2YWQxNmI3NTI4NTNkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTUzMzEsOC40OTgyODAzMDgxODEwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjliNmQ5NjgzMzk4NDUwMDhjZjVlMTY3NDkyMGY0NzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTU0NmNmZTNiYzY1NGE5NWI0ZGI4MGRhMTQ2MDU2ZWEgPSAkKCc8ZGl2IGlkPSJodG1sXzk1NDZjZmUzYmM2NTRhOTViNGRiODBkYTE0NjA1NmVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5obWFuc0B0cm9lc3QuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWI2ZDk2ODMzOTg0NTAwOGNmNWUxNjc0OTIwZjQ3OS5zZXRDb250ZW50KGh0bWxfOTU0NmNmZTNiYzY1NGE5NWI0ZGI4MGRhMTQ2MDU2ZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjQ5NTlhYmIwMWU2NDU0ZWE0NmFkMTZiNzUyODUzZDIuYmluZFBvcHVwKHBvcHVwXzY5YjZkOTY4MzM5ODQ1MDA4Y2Y1ZTE2NzQ5MjBmNDc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiMmI0NDljMWVkZTQ2ZjJiNWM0NzkwZTA4NzUzNjZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzOTc3NDUsOC40OTgzMjAwODA3Njg3MjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzU4MzQ5OTk2ZTk2NGFmZjlkNzFhODUzMzEwNjczZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzgzYjhhMzQ3OGM3NGQ3YThhOTI3OGI3ZGM5ODQxMTAgPSAkKCc8ZGl2IGlkPSJodG1sXzM4M2I4YTM0NzhjNzRkN2E4YTkyNzhiN2RjOTg0MTEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5nZXJsYWNoZ2VyaGFyZHRAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTgzNDk5OTZlOTY0YWZmOWQ3MWE4NTMzMTA2NzNlZi5zZXRDb250ZW50KGh0bWxfMzgzYjhhMzQ3OGM3NGQ3YThhOTI3OGI3ZGM5ODQxMTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWIyYjQ0OWMxZWRlNDZmMmI1YzQ3OTBlMDg3NTM2NmMuYmluZFBvcHVwKHBvcHVwXzc1ODM0OTk5NmU5NjRhZmY5ZDcxYTg1MzMxMDY3M2VmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlZDc1ZTZlYTdhODRhNThhZmY4YWRhNzZmNDIzNzMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDExMDQ4MDUwMDAwMDA1LDguNDg3MDMwOTE1OTg1NzA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlZTQzODZjNDNlNjQxNGFhYmFjYmYxMDU3ZDkxZmNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkNDJhOThiYTNlMTQ0YWI4YTliYTNmOTI1YWQ2Y2Y2ID0gJCgnPGRpdiBpZD0iaHRtbF81ZDQyYTk4YmEzZTE0NGFiOGE5YmEzZjkyNWFkNmNmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aGFyZHk2OEBib2x6bWFubi5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGVlNDM4NmM0M2U2NDE0YWFiYWNiZjEwNTdkOTFmY2Euc2V0Q29udGVudChodG1sXzVkNDJhOThiYTNlMTQ0YWI4YTliYTNmOTI1YWQ2Y2Y2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlZDc1ZTZlYTdhODRhNThhZmY4YWRhNzZmNDIzNzMwLmJpbmRQb3B1cChwb3B1cF8wZWU0Mzg2YzQzZTY0MTRhYWJhY2JmMTA1N2Q5MWZjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNWFlYzVmZDI5ZDg0MTc4ODVhYzZhY2FiOTI3OTY5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzM1NjY1LDguNDk1MTQyMzE5NjcxMzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDFhN2YxYzAzNjg4NDg1MDkwYzlhMmVhMzg1NjJiZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODdhNmVjMTQwM2Y3NDNhMGJmZDkxNWFlNzMzMGJhNWUgPSAkKCc8ZGl2IGlkPSJodG1sXzg3YTZlYzE0MDNmNzQzYTBiZmQ5MTVhZTczMzBiYTVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5odWdvMzNAYm9sYW5kZXIuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MWE3ZjFjMDM2ODg0ODUwOTBjOWEyZWEzODU2MmJmMi5zZXRDb250ZW50KGh0bWxfODdhNmVjMTQwM2Y3NDNhMGJmZDkxNWFlNzMzMGJhNWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTVhZWM1ZmQyOWQ4NDE3ODg1YWM2YWNhYjkyNzk2OTkuYmluZFBvcHVwKHBvcHVwXzQxYTdmMWMwMzY4ODQ4NTA5MGM5YTJlYTM4NTYyYmYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YwNGUxYjFlNWU3NjRmMjI4M2Q1ZTg3YWZjYWQwZWNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MjQ1MjUsOC40OTIzMTY5OTIyOTQ0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YjExZTkwMjNhNjg0MmVkODM4YzNkM2Q1YjFlNDk3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZWIxY2JhMWE0ODk0OGJiYjAzMjEwNjU3MzViMzY0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ViMWNiYTFhNDg5NDhiYmIwMzIxMDY1NzM1YjM2NDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPm1vZWNobGljaGVubGp1YmljYUB3aWVsb2NoLm9yZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWIxMWU5MDIzYTY4NDJlZDgzOGMzZDNkNWIxZTQ5Nzcuc2V0Q29udGVudChodG1sXzdlYjFjYmExYTQ4OTQ4YmJiMDMyMTA2NTczNWIzNjQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwNGUxYjFlNWU3NjRmMjI4M2Q1ZTg3YWZjYWQwZWNmLmJpbmRQb3B1cChwb3B1cF85YjExZTkwMjNhNjg0MmVkODM4YzNkM2Q1YjFlNDk3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjZkNmNmOTQzN2Q0OTgzYmUzMDVkOWIzNzQ5OGE0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzQ1MzcsOC40ODgzMjg5MjgwMTIwNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2YyYjcwYzFmMThlNDRhNGE5MTY1MDM5NmNlYTQ3YzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTQ0NjhjMTFiOGU4NDIyMjkwYzdiMGU3NzkwMzBiNGEgPSAkKCc8ZGl2IGlkPSJodG1sXzE0NDY4YzExYjhlODQyMjI5MGM3YjBlNzc5MDMwYjRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5sb3R0aTQ2QGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2YyYjcwYzFmMThlNDRhNGE5MTY1MDM5NmNlYTQ3Yzcuc2V0Q29udGVudChodG1sXzE0NDY4YzExYjhlODQyMjI5MGM3YjBlNzc5MDMwYjRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZiNmQ2Y2Y5NDM3ZDQ5ODNiZTMwNWQ5YjM3NDk4YTQ4LmJpbmRQb3B1cChwb3B1cF83ZjJiNzBjMWYxOGU0NGE0YTkxNjUwMzk2Y2VhNDdjNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZmNmNzEwMjNiMTc0YTAyOThmN2U1MTM4OTllNWM2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjM5NTU3MTc1LDguNTE0MjA5OTUwNDAwODE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2YjNjMTkzNDVhZjRkZTJiOWU2MjEwODJlMWM0YTdkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczMjc3MDkyZWVmMTQ2YzE5YTMyMWY2YWQ4ODI5ZjExID0gJCgnPGRpdiBpZD0iaHRtbF83MzI3NzA5MmVlZjE0NmMxOWEzMjFmNmFkODgyOWYxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+c2thYnVzQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NmIzYzE5MzQ1YWY0ZGUyYjllNjIxMDgyZTFjNGE3ZC5zZXRDb250ZW50KGh0bWxfNzMyNzcwOTJlZWYxNDZjMTlhMzIxZjZhZDg4MjlmMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmZjZjcxMDIzYjE3NGEwMjk4ZjdlNTEzODk5ZTVjNjUuYmluZFBvcHVwKHBvcHVwXzg2YjNjMTkzNDVhZjRkZTJiOWU2MjEwODJlMWM0YTdkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M5MWI1ZmE0ODY4ZDRmNGViZWYzZDNmNDRhZjZkMDMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzMjc0ODUsOC41MDM4ODU4NTExMjY1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzBlZDVjYTIyMzA0ODRkYjYzODNkOTUwNDM2MDVlMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZjI2NDUxMWU2MWM0N2M0OWU5NDUyMTI1YTE0NjZiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2YyNjQ1MTFlNjFjNDdjNDllOTQ1MjEyNWExNDY2YmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmJvdWNzZWlua2FybC1qb3NlZkB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmMwZWQ1Y2EyMjMwNDg0ZGI2MzgzZDk1MDQzNjA1ZTEuc2V0Q29udGVudChodG1sXzdmMjY0NTExZTYxYzQ3YzQ5ZTk0NTIxMjVhMTQ2NmJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5MWI1ZmE0ODY4ZDRmNGViZWYzZDNmNDRhZjZkMDMyLmJpbmRQb3B1cChwb3B1cF9iYzBlZDVjYTIyMzA0ODRkYjYzODNkOTUwNDM2MDVlMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTgyNjllZjQ4NDY0ZmYyOWRjNGFmNWNhMjc4NWFiOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzUyNzMsOC40OTI1Mzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0MGU4MzY0YWYxNjQxZDA4M2ZhMWMyMjI5ZWUyNDUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJiNTgxN2I4ZjhiYjQzMjRiOGVkNjMzNzBjYmFlMDI4ID0gJCgnPGRpdiBpZD0iaHRtbF8yYjU4MTdiOGY4YmI0MzI0YjhlZDYzMzcwY2JhZTAyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bmV1c2NoYWVmZXJlbWlsQHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNDBlODM2NGFmMTY0MWQwODNmYTFjMjIyOWVlMjQ1Mi5zZXRDb250ZW50KGh0bWxfMmI1ODE3YjhmOGJiNDMyNGI4ZWQ2MzM3MGNiYWUwMjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGU4MjY5ZWY0ODQ2NGZmMjlkYzRhZjVjYTI3ODVhYjkuYmluZFBvcHVwKHBvcHVwX2Q0MGU4MzY0YWYxNjQxZDA4M2ZhMWMyMjI5ZWUyNDUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmNGQ1NDBlMmU3YzQxN2Y5OWU2Y2QxMWY0OWI0ZmE4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDE0MDY5NDUsOC40ODAzNjY3MTkyNDUxMzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzhhY2Y0ZTk0MzM5NDRjMWE2Zjg5Y2M1MzVjZTNlNDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGZlYmYyOWFmZjYzNDNlMmI5YjcyZWUyMjc5MDFjMjEgPSAkKCc8ZGl2IGlkPSJodG1sXzRmZWJmMjlhZmY2MzQzZTJiOWI3MmVlMjI3OTAxYzIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zY2hvZW5sYW5kbmF0YWxpYUBoZXNlci5uZXQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4YWNmNGU5NDMzOTQ0YzFhNmY4OWNjNTM1Y2UzZTQzLnNldENvbnRlbnQoaHRtbF80ZmViZjI5YWZmNjM0M2UyYjliNzJlZTIyNzkwMWMyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZjRkNTQwZTJlN2M0MTdmOTllNmNkMTFmNDliNGZhOC5iaW5kUG9wdXAocG9wdXBfMzhhY2Y0ZTk0MzM5NDRjMWE2Zjg5Y2M1MzVjZTNlNDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNkMDg2NWJjNmM2NDZjMmJhMGZmZmI0NTViMzdkYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTA1NjY5LDguNDgzNjIwMDY4ODk1OTA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkMzk4MjEyMWNhODQ1OGE5YWYyMTFjN2RmNTVhNGE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4NjJmYWE4MWE1NTQ4NzY5Y2NjNjQ1YzdhNmEyNzQwID0gJCgnPGRpdiBpZD0iaHRtbF82ODYyZmFhODFhNTU0ODc2OWNjYzY0NWM3YTZhMjc0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bWFybGllc2V3ZWlzc0Bhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkMzk4MjEyMWNhODQ1OGE5YWYyMTFjN2RmNTVhNGE0LnNldENvbnRlbnQoaHRtbF82ODYyZmFhODFhNTU0ODc2OWNjYzY0NWM3YTZhMjc0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2QwODY1YmM2YzY0NmMyYmEwZmZmYjQ1NWIzN2RiMy5iaW5kUG9wdXAocG9wdXBfYWQzOTgyMTIxY2E4NDU4YTlhZjIxMWM3ZGY1NWE0YTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTBjNjEwYjFjZjM5NGY2YWEzMzA3ODJkMjBmNDc4MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDM5MzY5LDguNDkyOTYwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MGVjZjBmN2Q1MjM0NTIwYmNmNTIyYjg2NjJkMjI5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzUyNGI2NmFmMmI0NjU4YjFmMjk5ODgwMjNmYjg3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTM1MjRiNjZhZjJiNDY1OGIxZjI5OTg4MDIzZmI4NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNhZXViZXJsaWNoaGFucy13aWxsaUByZWluaGFyZHQuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MGVjZjBmN2Q1MjM0NTIwYmNmNTIyYjg2NjJkMjI5Mi5zZXRDb250ZW50KGh0bWxfYTM1MjRiNjZhZjJiNDY1OGIxZjI5OTg4MDIzZmI4NzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTBjNjEwYjFjZjM5NGY2YWEzMzA3ODJkMjBmNDc4MDguYmluZFBvcHVwKHBvcHVwXzQwZWNmMGY3ZDUyMzQ1MjBiY2Y1MjJiODY2MmQyMjkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3N2M1NjFiMjU0YzQ0MDI4YWIxN2M5MGU2Yzc5MDFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDEzNTEyMSw4LjQ3ODY4OTc1NDg5NzU2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZGM4NTM0YzVhY2I0ZTg4OGJiMzZlNmE4NGYwMjE5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NWVmYTFmMzkxOWU0MmZjOGVhYjExYjFhZjNkYzlhNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTVlZmExZjM5MTllNDJmYzhlYWIxMWIxYWYzZGM5YTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPndpbG1zZW5rYXJvbGFAc2FldWJlcmxpY2guY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGM4NTM0YzVhY2I0ZTg4OGJiMzZlNmE4NGYwMjE5Ny5zZXRDb250ZW50KGh0bWxfNTVlZmExZjM5MTllNDJmYzhlYWIxMWIxYWYzZGM5YTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjc3YzU2MWIyNTRjNDQwMjhhYjE3YzkwZTZjNzkwMWIuYmluZFBvcHVwKHBvcHVwXzJkYzg1MzRjNWFjYjRlODg4YmIzNmU2YTg0ZjAyMTk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmZGM3YWJlNjA1MjQxYWE5NjU0MzFlMWU3NDgxMGNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzNDkyNCw4LjQ5NzM0OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjk3OTQwMTRiZTNhNGI0ZDljZjZlMGIzYjYyZWRhYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE5MmQyOWIzZjE0NDhlNjkwYjU1Yzk0ZjkwMDFhZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzFhOTJkMjliM2YxNDQ4ZTY5MGI1NWM5NGY5MDAxYWVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5pcmlzMzhAYmV5ZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5Nzk0MDE0YmUzYTRiNGQ5Y2Y2ZTBiM2I2MmVkYWFlLnNldENvbnRlbnQoaHRtbF8xYTkyZDI5YjNmMTQ0OGU2OTBiNTVjOTRmOTAwMWFlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZmRjN2FiZTYwNTI0MWFhOTY1NDMxZTFlNzQ4MTBjYi5iaW5kUG9wdXAocG9wdXBfNjk3OTQwMTRiZTNhNGI0ZDljZjZlMGIzYjYyZWRhYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDc2NGViYTgxNGJmNGEwNDlhNWE5ZDM3ODMzNzBkNDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTY2MjMsOC40ODEzNjM3MjMwMjMyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjk2OTJiZmZjYmE1NDdiNmEzODhkYjgyYTEyNGNmOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWRjZmY0ODRmNmQ2NDIzYjllMDEyYWE5YmE0YmM2NjYgPSAkKCc8ZGl2IGlkPSJodG1sX2VkY2ZmNDg0ZjZkNjQyM2I5ZTAxMmFhOWJhNGJjNjY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rcmF1c2VlcmRvZ2FuQGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjk2OTJiZmZjYmE1NDdiNmEzODhkYjgyYTEyNGNmOWIuc2V0Q29udGVudChodG1sX2VkY2ZmNDg0ZjZkNjQyM2I5ZTAxMmFhOWJhNGJjNjY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3NjRlYmE4MTRiZjRhMDQ5YTVhOWQzNzgzMzcwZDQ2LmJpbmRQb3B1cChwb3B1cF82OTY5MmJmZmNiYTU0N2I2YTM4OGRiODJhMTI0Y2Y5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTZjN2JhOWQ4OWU0MzQ4YTc1ZWFjM2Y3ODMzZGUxMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNTQyMDEsOC40OTg2ODU1NDA4MjM2NjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWJiNWY5ZTg2M2NmNDNlNDkwOTgxODcwYWZjM2VmOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWI0Njk0MjA1NGJjNGU2ZWFlNjMxMzVlNmRmZGQ5YTQgPSAkKCc8ZGl2IGlkPSJodG1sXzFiNDY5NDIwNTRiYzRlNmVhZTYzMTM1ZTZkZmRkOWE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ydXBwZXJzYmVyZ2Vyc3lsdmllQHNjaGlua2UuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiYjVmOWU4NjNjZjQzZTQ5MDk4MTg3MGFmYzNlZjlhLnNldENvbnRlbnQoaHRtbF8xYjQ2OTQyMDU0YmM0ZTZlYWU2MzEzNWU2ZGZkZDlhNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTZjN2JhOWQ4OWU0MzQ4YTc1ZWFjM2Y3ODMzZGUxMi5iaW5kUG9wdXAocG9wdXBfMWJiNWY5ZTg2M2NmNDNlNDkwOTgxODcwYWZjM2VmOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTk3YzdjZjBjNTRkNDEyYmIxMmI4NDg2Y2UyMDMzODcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTc3ODkxLDguNTExNTg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOWQxMGE0OWY0OGI0NzM0OWQwODU4ODBhODYyMzU1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yN2NjNGFhYjA5ZDY0NjMzODJmODdhYjNkMDlmNzAyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjdjYzRhYWIwOWQ2NDYzMzgyZjg3YWIzZDA5ZjcwMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNjaGVlbHJvc2VsaW5kZUBnbWFpbC5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5ZDEwYTQ5ZjQ4YjQ3MzQ5ZDA4NTg4MGE4NjIzNTVjLnNldENvbnRlbnQoaHRtbF8yN2NjNGFhYjA5ZDY0NjMzODJmODdhYjNkMDlmNzAyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OTdjN2NmMGM1NGQ0MTJiYjEyYjg0ODZjZTIwMzM4Ny5iaW5kUG9wdXAocG9wdXBfYjlkMTBhNDlmNDhiNDczNDlkMDg1ODgwYTg2MjM1NWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTVhZDE5YWMyN2FmNDNlZjg2ZjBkM2U5MjJhOTg2MTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDA2NzA0LDguNTA3Nzg5OTUyMzk0NDUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmNjU3NmEwZTI5MTQ1ZWE4N2E1ZTM5Njc0MWQ0Yjk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFlMDc3YzQzNDY3MDRkYWZiODM0ZTg0YzU4NzAzYmM2ID0gJCgnPGRpdiBpZD0iaHRtbF8xZTA3N2M0MzQ2NzA0ZGFmYjgzNGU4NGM1ODcwM2JjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Z3VlbnRlcmdvdHRoYXJkQGdteC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWY2NTc2YTBlMjkxNDVlYTg3YTVlMzk2NzQxZDRiOTYuc2V0Q29udGVudChodG1sXzFlMDc3YzQzNDY3MDRkYWZiODM0ZTg0YzU4NzAzYmM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1YWQxOWFjMjdhZjQzZWY4NmYwZDNlOTIyYTk4NjExLmJpbmRQb3B1cChwb3B1cF85ZjY1NzZhMGUyOTE0NWVhODdhNWUzOTY3NDFkNGI5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZTFkZmZkZGE2NzA0MWViYjNhM2U5N2E2NzcxOWVlZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzk3NzQ1LDguNDk4MzIwMDgwNzY4NzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlMzA5NDg5YTZhZjQ2Y2I5YzkyMzgwMDc4ZWMyMjdhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkZjY4YzI3NjJjNzQzZThhY2MzZjk0MjlhYzliNGY1ID0gJCgnPGRpdiBpZD0iaHRtbF80ZGY2OGMyNzYyYzc0M2U4YWNjM2Y5NDI5YWM5YjRmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YW5nZWxpY2FibG9jaEB3ZWIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlMzA5NDg5YTZhZjQ2Y2I5YzkyMzgwMDc4ZWMyMjdhLnNldENvbnRlbnQoaHRtbF80ZGY2OGMyNzYyYzc0M2U4YWNjM2Y5NDI5YWM5YjRmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZTFkZmZkZGE2NzA0MWViYjNhM2U5N2E2NzcxOWVlZS5iaW5kUG9wdXAocG9wdXBfNGUzMDk0ODlhNmFmNDZjYjljOTIzODAwNzhlYzIyN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDdhNjUzZGYzZTljNGVjZmFkM2MxMTM2YzkzZGQwNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTE1OTIyOTk5OTk5OTUsOC40ODU1Nzg3MjY0Mzc2NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU4OTg5MGZmZmNlNGMwNDk5ZTAxNzgxOWQyOTkzMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2YwOGZlMjY3ZjJlNGEwNGEzMGMxZDk3NWUwODUyODEgPSAkKCc8ZGl2IGlkPSJodG1sXzdmMDhmZTI2N2YyZTRhMDRhMzBjMWQ5NzVlMDg1MjgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij54c2NodWVsZXJAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTg5ODkwZmZmY2U0YzA0OTllMDE3ODE5ZDI5OTMxNS5zZXRDb250ZW50KGh0bWxfN2YwOGZlMjY3ZjJlNGEwNGEzMGMxZDk3NWUwODUyODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDdhNjUzZGYzZTljNGVjZmFkM2MxMTM2YzkzZGQwNDcuYmluZFBvcHVwKHBvcHVwXzQ1ODk4OTBmZmZjZTRjMDQ5OWUwMTc4MTlkMjk5MzE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1ODE4NGUxMTc2MjRmYWZhNTI1ZDY0YWQzN2ViNDIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA3MDU0NTUsOC40Nzk1NTI3NjU0MjkxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTUyZDA5YTE0OGVmNGNhNjkzMWFjNjAxYzBkYjI1ZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGFiZjNhNmRhMDkwNGY1ODgzZGIxMWYxNTk5ODliMDcgPSAkKCc8ZGl2IGlkPSJodG1sX2RhYmYzYTZkYTA5MDRmNTg4M2RiMTFmMTU5OTg5YjA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53aXJ0aGhlbnJ5a0B5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTUyZDA5YTE0OGVmNGNhNjkzMWFjNjAxYzBkYjI1ZGIuc2V0Q29udGVudChodG1sX2RhYmYzYTZkYTA5MDRmNTg4M2RiMTFmMTU5OTg5YjA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1ODE4NGUxMTc2MjRmYWZhNTI1ZDY0YWQzN2ViNDIzLmJpbmRQb3B1cChwb3B1cF8xNTJkMDlhMTQ4ZWY0Y2E2OTMxYWM2MDFjMGRiMjVkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Y2JhNGQzZGExYjc0MDNjYTRkOGE4ZmRmYzkzMDIyMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTA2Nzk5OTk5OTk5NSw4LjQ5ODY2MDkwMDA1ODQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OWNlOTQ0MzRlYTI0NjdmYjg3ZTQ3OTczNzBhNGMxZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWY0MGUzODhmNGQ0ZjI5ODNlMGIzZmQ1ZTlhMGQ1ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDlmNDBlMzg4ZjRkNGYyOTgzZTBiM2ZkNWU5YTBkNWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnNlbG1hYXVzdGVybXVlaGxlQGdvb2dsZW1haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWNlOTQ0MzRlYTI0NjdmYjg3ZTQ3OTczNzBhNGMxZi5zZXRDb250ZW50KGh0bWxfNDlmNDBlMzg4ZjRkNGYyOTgzZTBiM2ZkNWU5YTBkNWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGNiYTRkM2RhMWI3NDAzY2E0ZDhhOGZkZmM5MzAyMjEuYmluZFBvcHVwKHBvcHVwXzY5Y2U5NDQzNGVhMjQ2N2ZiODdlNDc5NzM3MGE0YzFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5NWI1NzU0YmQ2OTRiZjVhNjUyYmZhNWU3MGYzYzAyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk2MDgxNCw4LjUwNjE0NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTdkNzk2OTExNGQ0NDZmNzk4YTA1YjI3ZjQ5MmNlZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzdlMTcxOGU2MjAxNGQ1Yjg4MzhkOTg5Y2UzY2Y1N2QgPSAkKCc8ZGl2IGlkPSJodG1sX2M3ZTE3MThlNjIwMTRkNWI4ODM4ZDk4OWNlM2NmNTdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ydXBwZXJ0Y29uc3RhbmNlQGJhcnRoLm9yZzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTdkNzk2OTExNGQ0NDZmNzk4YTA1YjI3ZjQ5MmNlZTcuc2V0Q29udGVudChodG1sX2M3ZTE3MThlNjIwMTRkNWI4ODM4ZDk4OWNlM2NmNTdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5NWI1NzU0YmQ2OTRiZjVhNjUyYmZhNWU3MGYzYzAyLmJpbmRQb3B1cChwb3B1cF9lN2Q3OTY5MTE0ZDQ0NmY3OThhMDViMjdmNDkyY2VlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNWEyMTcwZWYxOWI0YjkwODc5YjQ4ZmYyN2Y2YzRlMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzA1NDU1LDguNDc5NTUyNzY1NDI5MTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U2M2M3NjhjZjNiYjQ5YWI5Zjk5MDU2OGE3OTFiMmU5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhNGRhNGIzNTdiZDQwZDI5ZjI0NGE1NDUyYjdkMThmID0gJCgnPGRpdiBpZD0iaHRtbF84YTRkYTRiMzU3YmQ0MGQyOWYyNDRhNTQ1MmI3ZDE4ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZmxhbnR6ZW1pbmVAZ21haWwuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNjNjNzY4Y2YzYmI0OWFiOWY5OTA1NjhhNzkxYjJlOS5zZXRDb250ZW50KGh0bWxfOGE0ZGE0YjM1N2JkNDBkMjlmMjQ0YTU0NTJiN2QxOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTVhMjE3MGVmMTliNGI5MDg3OWI0OGZmMjdmNmM0ZTEuYmluZFBvcHVwKHBvcHVwX2U2M2M3NjhjZjNiYjQ5YWI5Zjk5MDU2OGE3OTFiMmU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhkY2EzMTA0Zjk5YjRlZTA5ZjVlMGM0ZWJlZWY0MTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5MTcyMSw4LjQ5Nzg0NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmZTc5NmNjYzRiMTQzMDU5YmNjYmM4NTk2OTE5MjY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxYWVkMWM0MzJmYzQxYzk4ZThlMGFmM2FiZDEzOTE2ID0gJCgnPGRpdiBpZD0iaHRtbF9iMWFlZDFjNDMyZmM0MWM5OGU4ZTBhZjNhYmQxMzkxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aG9mZm1hbm5jZW50YUBhb2wuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VmZTc5NmNjYzRiMTQzMDU5YmNjYmM4NTk2OTE5MjY3LnNldENvbnRlbnQoaHRtbF9iMWFlZDFjNDMyZmM0MWM5OGU4ZTBhZjNhYmQxMzkxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZGNhMzEwNGY5OWI0ZWUwOWY1ZTBjNGViZWVmNDE5Yy5iaW5kUG9wdXAocG9wdXBfZWZlNzk2Y2NjNGIxNDMwNTliY2NiYzg1OTY5MTkyNjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmZmOThiYjU4ODBkNDRjZjg0NmQwODYxMmZlZjcyNTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDcyMTM4NSw4LjQ5NDI5NjQwMDQ2Mjc0NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYThmNmQ0NzRkNGQ0YWQwOTFmOWMwNmI0NmQxNGNhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZjEyMGY5MzI1YWI0MWY3OTc1ZGNjNmRkODk1ODFiYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWYxMjBmOTMyNWFiNDFmNzk3NWRjYzZkZDg5NTgxYmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmNvcmQ5OEBnb29nbGVtYWlsLmNvbTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWE4ZjZkNDc0ZDRkNGFkMDkxZjljMDZiNDZkMTRjYWMuc2V0Q29udGVudChodG1sX2VmMTIwZjkzMjVhYjQxZjc5NzVkY2M2ZGQ4OTU4MWJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmZjk4YmI1ODgwZDQ0Y2Y4NDZkMDg2MTJmZWY3MjU0LmJpbmRQb3B1cChwb3B1cF9hYThmNmQ0NzRkNGQ0YWQwOTFmOWMwNmI0NmQxNGNhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NTllODhiY2IyNTg0MWFjYThiNWQ0NTI1ZjA2YWNlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwNzUxMDQsOC40ODU5MzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmNmEwY2M0NWIzZDRhOGI5NWE3ZDA4MWVmNTUyMzRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzN2ZiZDg1NTcxMzRkZWRhZmFlOGRkNjM4NTUyMDZhID0gJCgnPGRpdiBpZD0iaHRtbF9hMzdmYmQ4NTU3MTM0ZGVkYWZhZThkZDYzODU1MjA2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+ZGVubnk0OEBoZWxsd2lnLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjZhMGNjNDViM2Q0YThiOTVhN2QwODFlZjU1MjM0ZC5zZXRDb250ZW50KGh0bWxfYTM3ZmJkODU1NzEzNGRlZGFmYWU4ZGQ2Mzg1NTIwNmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODU5ZTg4YmNiMjU4NDFhY2E4YjVkNDUyNWYwNmFjZWIuYmluZFBvcHVwKHBvcHVwX2JmNmEwY2M0NWIzZDRhOGI5NWE3ZDA4MWVmNTUyMzRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4NmE1NThhZTk3ZjQxNzM5ZDc2ODE2YWQ4MmYyZGNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk5NTc5Niw4LjUwMzQ1NjU3ODEzMzYzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNDI5NzVjYmZmY2I0ZGY4OGNhYzgwN2VlMzk0MTk4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZTI0ZmY0YjlkMzI0ZTcxOTc5OTI3OGM0NDcwN2E3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2UyNGZmNGI5ZDMyNGU3MTk3OTkyNzhjNDQ3MDdhNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmphbm5hNzdAZ2llc3MuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0Mjk3NWNiZmZjYjRkZjg4Y2FjODA3ZWUzOTQxOTgxLnNldENvbnRlbnQoaHRtbF83ZTI0ZmY0YjlkMzI0ZTcxOTc5OTI3OGM0NDcwN2E3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODZhNTU4YWU5N2Y0MTczOWQ3NjgxNmFkODJmMmRjYS5iaW5kUG9wdXAocG9wdXBfMDQyOTc1Y2JmZmNiNGRmODhjYWM4MDdlZTM5NDE5ODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTk2MjRiNzJkYTZlNDY5MTg4OGRmNjJmODg1NGY1ZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MTY0NjkzLDguNDgyMzIyMjQ4Mjg3NDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5YjE4MWI0ZjU5OTQ1YjFhZDNiOTlkYjdkNDJjYTQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5Mzk2MmY3NmU2MzQzOWU4ZDc1M2ZlN2VhYmVlZjM3ID0gJCgnPGRpdiBpZD0iaHRtbF8wOTM5NjJmNzZlNjM0MzllOGQ3NTNmZTdlYWJlZWYzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+bmFzZXJkYWdvYmVydEB5YWhvby5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzliMTgxYjRmNTk5NDViMWFkM2I5OWRiN2Q0MmNhNDguc2V0Q29udGVudChodG1sXzA5Mzk2MmY3NmU2MzQzOWU4ZDc1M2ZlN2VhYmVlZjM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U5NjI0YjcyZGE2ZTQ2OTE4ODhkZjYyZjg4NTRmNWZjLmJpbmRQb3B1cChwb3B1cF83OWIxODFiNGY1OTk0NWIxYWQzYjk5ZGI3ZDQyY2E0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDFkYWZkYWEzZmM0NDQzYjNiN2JhNGMxYWNkMjdhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzUyNzMsOC40OTI1Mzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzYzhhYWZjNmIxZjRkODBiNmU1YWZiNjA2ZWQ0M2E5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2ZGVkZTVjNWMxYzQ0ODVhMGUwNTc0Njc2ZjU4NzE1ID0gJCgnPGRpdiBpZD0iaHRtbF8wNmRlZGU1YzVjMWM0NDg1YTBlMDU3NDY3NmY1ODcxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YWhtYWRkaXBwZWxAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iM2M4YWFmYzZiMWY0ZDgwYjZlNWFmYjYwNmVkNDNhOS5zZXRDb250ZW50KGh0bWxfMDZkZWRlNWM1YzFjNDQ4NWEwZTA1NzQ2NzZmNTg3MTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQxZGFmZGFhM2ZjNDQ0M2IzYjdiYTRjMWFjZDI3YWMuYmluZFBvcHVwKHBvcHVwX2IzYzhhYWZjNmIxZjRkODBiNmU1YWZiNjA2ZWQ0M2E5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlOGExZTcyYzc5MDQ1Zjc4OTAzNDNlMmY5Y2JkZGI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk3MjM5Nyw4LjUwMjk5ODVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTExYjk3OTlhMTVmNDNhNmFiNjg2N2MxMDgzNTUwZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTE1YTJmOTY5ZjkxNDc0Mzg5YjQ0MGYxOTc5YjMyOGEgPSAkKCc8ZGl2IGlkPSJodG1sXzUxNWEyZjk2OWY5MTQ3NDM4OWI0NDBmMTk3OWIzMjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5jaHJpc3RvcGhlcjg2QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTExYjk3OTlhMTVmNDNhNmFiNjg2N2MxMDgzNTUwZWIuc2V0Q29udGVudChodG1sXzUxNWEyZjk2OWY5MTQ3NDM4OWI0NDBmMTk3OWIzMjhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlOGExZTcyYzc5MDQ1Zjc4OTAzNDNlMmY5Y2JkZGI0LmJpbmRQb3B1cChwb3B1cF81MTFiOTc5OWExNWY0M2E2YWI2ODY3YzEwODM1NTBlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNWRkYzA0MmEwMDk0N2QxYTM3YzAwMDI4ZmZiODNkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMzA0ODY1LDguNDc4MDI3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MWQ3ZTUyMTVlMDY0ZGUwODkxMTNjOTlmZjhkYzczMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDQxZDE3OWE3ZmM0ZTlhYWUwMmU3Zjk3MjFmNmE2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ0MWQxNzlhN2ZjNGU5YWFlMDJlN2Y5NzIxZjZhNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPnJvc2EtbWFyaWFzY2htaWR0QGFvbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTFkN2U1MjE1ZTA2NGRlMDg5MTEzYzk5ZmY4ZGM3MzIuc2V0Q29udGVudChodG1sXzI0NDFkMTc5YTdmYzRlOWFhZTAyZTdmOTcyMWY2YTY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1ZGRjMDQyYTAwOTQ3ZDFhMzdjMDAwMjhmZmI4M2QzLmJpbmRQb3B1cChwb3B1cF85MWQ3ZTUyMTVlMDY0ZGUwODkxMTNjOTlmZjhkYzczMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNDljMTliNGIyNTM0NjYzODEwNTY1YzA5ZmQ1ZTU3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxNTA5MjM1LDguNDc4Njk3NjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJkZjIzZjA5YjExNDgwZmFjZDgwMWEwMzJhZDdmNzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjg1NDRmYWE4MTEwNDJmN2FkNDU0MjZmMDUxYzMxYjAgPSAkKCc8ZGl2IGlkPSJodG1sXzY4NTQ0ZmFhODExMDQyZjdhZDQ1NDI2ZjA1MWMzMWIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ob3JzdGJydWRlckBoYW1hbm4uZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyZGYyM2YwOWIxMTQ4MGZhY2Q4MDFhMDMyYWQ3ZjczLnNldENvbnRlbnQoaHRtbF82ODU0NGZhYTgxMTA0MmY3YWQ0NTQyNmYwNTFjMzFiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNDljMTliNGIyNTM0NjYzODEwNTY1YzA5ZmQ1ZTU3ZS5iaW5kUG9wdXAocG9wdXBfZDJkZjIzZjA5YjExNDgwZmFjZDgwMWEwMzJhZDdmNzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDkwNGRhODU1MmZmNDA4Njk3N2E1MzlhYTYyMjBiNGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDYyMzYxLDguNDk1MDE2MjQ5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyZDU3YjBhMTFkNjRlZmZhMGNjM2U4ZDlhYTUwMTQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyOGUyMzFmZGEzNDQwNWJhMjQ5ODNlZTg5ZTQ2OWFiID0gJCgnPGRpdiBpZD0iaHRtbF8xMjhlMjMxZmRhMzQ0MDViYTI0OTgzZWU4OWU0NjlhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+cm9lcnJpY2h0bWFyaWFAZ214LmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmQ1N2IwYTExZDY0ZWZmYTBjYzNlOGQ5YWE1MDE0OC5zZXRDb250ZW50KGh0bWxfMTI4ZTIzMWZkYTM0NDA1YmEyNDk4M2VlODllNDY5YWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDkwNGRhODU1MmZmNDA4Njk3N2E1MzlhYTYyMjBiNGEuYmluZFBvcHVwKHBvcHVwXzYyZDU3YjBhMTFkNjRlZmZhMGNjM2U4ZDlhYTUwMTQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyMjBmZjIxNWJjMDQyOTJiZDg4MDBkMmFkNmU1Njc2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4Njg3NCw4LjUwMjk3MDQ0MTk1MTYzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOWVjN2UzOGUwODc0NzJhYjRkMDY4Mzk4ZDhhYzUzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZjIxYTFlYzkzMjU0YmZmODY4OTdiMWU3MDZiNTMyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWYyMWExZWM5MzI1NGJmZjg2ODk3YjFlNzA2YjUzMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmxpc2Vsb3R0ZTI5QHJpdHRlci5jb208L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y5ZWM3ZTM4ZTA4NzQ3MmFiNGQwNjgzOThkOGFjNTNhLnNldENvbnRlbnQoaHRtbF9lZjIxYTFlYzkzMjU0YmZmODY4OTdiMWU3MDZiNTMyYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MjIwZmYyMTViYzA0MjkyYmQ4ODAwZDJhZDZlNTY3Ni5iaW5kUG9wdXAocG9wdXBfZjllYzdlMzhlMDg3NDcyYWI0ZDA2ODM5OGQ4YWM1M2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjAyMDY3MjE4OWQ5NDk5ZGI0ZTk5MjM2MjYwYTJjZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAwMDI0LDguNTA4MTYxOTIzODg0NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMWFmZmNiMTU1NzQwYWE5YWYxNjgyYmU3YWVmZTY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0ZWU4YTRlM2RlNTQ1ZWFhMzRhMzg2ZWEwZTFlODY3ID0gJCgnPGRpdiBpZD0iaHRtbF81NGVlOGE0ZTNkZTU0NWVhYTM0YTM4NmVhMGUxZTg2NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+YnVyY2toYXJkcGxhdGhAaG90bWFpbC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2MxYWZmY2IxNTU3NDBhYTlhZjE2ODJiZTdhZWZlNjUuc2V0Q29udGVudChodG1sXzU0ZWU4YTRlM2RlNTQ1ZWFhMzRhMzg2ZWEwZTFlODY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwMjA2NzIxODlkOTQ5OWRiNGU5OTIzNjI2MGEyY2YzLmJpbmRQb3B1cChwb3B1cF9jYzFhZmZjYjE1NTc0MGFhOWFmMTY4MmJlN2FlZmU2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDVhYWVlYmFkNGU0NWNkOTcwODQ3YTI0ZmQ1MWU0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQxMjIxNzQsOC40ODE3MTQ0OTEwMTg3NzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjM1YzE1YTZmMTE5NDc3MWE0NzU2YjhkMzdjNTFiNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjAwMGFiNDNmZGVlNDU0M2I4Y2M3Njk1ZjBiMTBlZTMgPSAkKCc8ZGl2IGlkPSJodG1sX2IwMDBhYjQzZmRlZTQ1NDNiOGNjNzY5NWYwYjEwZWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5rbGVtZW5zMTBAbWFuZ29sZC5kZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjM1YzE1YTZmMTE5NDc3MWE0NzU2YjhkMzdjNTFiNjUuc2V0Q29udGVudChodG1sX2IwMDBhYjQzZmRlZTQ1NDNiOGNjNzY5NWYwYjEwZWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FkNWFhZWViYWQ0ZTQ1Y2Q5NzA4NDdhMjRmZDUxZTRjLmJpbmRQb3B1cChwb3B1cF82MzVjMTVhNmYxMTk0NzcxYTQ3NTZiOGQzN2M1MWI2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMDU1MjA0OGE2NTY0ZDAzYTVmYTU4NDQ1YTgxM2YwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwODQ2Niw4LjQ4NDM3MTg5ODAyMDIyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzEyMzRjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MDhlZGU5OWQ2YzE0MzBkOWRhYzNlYjEzNDk3MmIzNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81N2UxZGRiNDllNDM0M2ViYTA4OWJmMmU3MmUxMTJhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTdlMWRkYjQ5ZTQzNDNlYmEwODliZjJlNzJlMTEyYWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPmFkZWxiZXJ0c29udGFnQHRhZXNjaGUuY29tPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MDhlZGU5OWQ2YzE0MzBkOWRhYzNlYjEzNDk3MmIzNi5zZXRDb250ZW50KGh0bWxfNTdlMWRkYjQ5ZTQzNDNlYmEwODliZjJlNzJlMTEyYWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDA1NTIwNDhhNjU2NGQwM2E1ZmE1ODQ0NWE4MTNmMGYuYmluZFBvcHVwKHBvcHVwXzgwOGVkZTk5ZDZjMTQzMGQ5ZGFjM2ViMTM0OTcyYjM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjYjE2MWE3MGU1NTQ2NzRhZWE1ODUxZWU0OTNiMWNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuMzk4NzQ4NDk5OTk5OTk2LDguNTEwMDIzMDc1NzIyNzg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzMTY2YTFmNjU0NDQ0OGRhYWViMjViODM4NGYxNTVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2ZDljNDMwMzNlZTRlMjE4YjdiNTU2NDcxMGUwZGMzID0gJCgnPGRpdiBpZD0iaHRtbF82NmQ5YzQzMDMzZWU0ZTIxOGI3YjU1NjQ3MTBlMGRjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Ym9kbzE0QHlhaG9vLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzE2NmExZjY1NDQ0NDhkYWFlYjI1YjgzODRmMTU1ZS5zZXRDb250ZW50KGh0bWxfNjZkOWM0MzAzM2VlNGUyMThiN2I1NTY0NzEwZTBkYzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmNiMTYxYTcwZTU1NDY3NGFlYTU4NTFlZTQ5M2IxY2MuYmluZFBvcHVwKHBvcHVwX2MzMTY2YTFmNjU0NDQ0OGRhYWViMjViODM4NGYxNTVlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4MmQ3NzE3OWM1NjRmN2ViM2RiYmZlMzNkNTFmYWE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDA1MzE0MzUsOC40OTIxMDQ0MTk1MzU0ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDQ4OGMzN2JkZDgwNDA3OTlmODhjNzAyM2ViMDVjYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNmMjk5ZTUzYTBiNDNhYjk0NmVmYzI1ZTE5MzdhYWIgPSAkKCc8ZGl2IGlkPSJodG1sXzEzZjI5OWU1M2EwYjQzYWI5NDZlZmMyNWUxOTM3YWFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5zY2htaWR0Z2lub0Byb2VtZXIuZGU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0ODhjMzdiZGQ4MDQwNzk5Zjg4YzcwMjNlYjA1Y2JhLnNldENvbnRlbnQoaHRtbF8xM2YyOTllNTNhMGI0M2FiOTQ2ZWZjMjVlMTkzN2FhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ODJkNzcxNzljNTY0ZjdlYjNkYmJmZTMzZDUxZmFhOS5iaW5kUG9wdXAocG9wdXBfZDQ4OGMzN2JkZDgwNDA3OTlmODhjNzAyM2ViMDVjYmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTI3M2U4ZWFkNTVhNDdlMmEzZTdjMmQ2NGQ2YTA5MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDI0OTE0LDguNDg1Mzc5MTU0MjIyMjY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMTIzNGNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjYjg3ODkwMDY2NDQzNmRhMDRmYjlhNWJjZDVlNDI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1NGY3MGUzOWJmMTQzNzJiYjFmNDA5NjAwMTBkZjQwID0gJCgnPGRpdiBpZD0iaHRtbF84NTRmNzBlMzliZjE0MzcyYmIxZjQwOTYwMDEwZGY0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+aXNhYmVsbGp1bmtAd2ViLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kY2I4Nzg5MDA2NjQ0MzZkYTA0ZmI5YTViY2Q1ZTQyNy5zZXRDb250ZW50KGh0bWxfODU0ZjcwZTM5YmYxNDM3MmJiMWY0MDk2MDAxMGRmNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTI3M2U4ZWFkNTVhNDdlMmEzZTdjMmQ2NGQ2YTA5MDguYmluZFBvcHVwKHBvcHVwX2RjYjg3ODkwMDY2NDQzNmRhMDRmYjlhNWJjZDVlNDI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3YzBmMzdmNzZjZDRmNzc5MWEwNWUwY2I5MGIzYjE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAzMDU4Niw4LjUwMTkyMTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMxMjM0Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzYxMDIwYjNlYjJlNDU3NjhmZGFmNjNmOWUwOGQzNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTEyODc0MmM3NjIxNDFmZjhjZWJlM2FhYjZlOGI3OGYgPSAkKCc8ZGl2IGlkPSJodG1sXzkxMjg3NDJjNzYyMTQxZmY4Y2ViZTNhYWI2ZThiNzhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij53ZWl0emVsZGFuaWVsYUBob3RtYWlsLmRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjEwMjBiM2ViMmU0NTc2OGZkYWY2M2Y5ZTA4ZDM1Yi5zZXRDb250ZW50KGh0bWxfOTEyODc0MmM3NjIxNDFmZjhjZWJlM2FhYjZlOGI3OGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTdjMGYzN2Y3NmNkNGY3NzkxYTA1ZTBjYjkwYjNiMTcuYmluZFBvcHVwKHBvcHVwXzM2MTAyMGIzZWIyZTQ1NzY4ZmRhZjYzZjllMDhkMzViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU5Y2U4ZjI4NGM0YTQ0YmE5NmNmOTFmZmM0MGU4M2Q3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMTcxNzE1NDc3NDg2LDguNDk1OTk3MjQ2NjQ4MzEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZWZmMmEyZTA5OTY0MmY2YTYzOGZmMmI3YjgwNzAyYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OGNjZDY3MGU2OGU0M2ZlYTM4YmYyN2M4ODU5YTdlYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzhjY2Q2NzBlNjhlNDNmZWEzOGJmMjdjODg1OWE3ZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktlYmFiLUhhdXMgSMO2bmdnPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZWZmMmEyZTA5OTY0MmY2YTYzOGZmMmI3YjgwNzAyYi5zZXRDb250ZW50KGh0bWxfNzhjY2Q2NzBlNjhlNDNmZWEzOGJmMjdjODg1OWE3ZWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTljZThmMjg0YzRhNDRiYTk2Y2Y5MWZmYzQwZTgzZDcuYmluZFBvcHVwKHBvcHVwXzVlZmYyYTJlMDk5NjQyZjZhNjM4ZmYyYjdiODA3MDJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FiMDBlODc2ZWQwZTRiZTc5YzM1NDRhNzQ2ZWQ0ODVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyMDgyODkzNjg5Mjc2LDguNDk2OTAzNDE2OTAwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMGRhNDY0ZDMwODI0ZTYxOGFmOWI4YzlmZDVmNTcxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYWFlZTVhYzRhMTE0NzgwYjFiMWQ1ZThlMWZlNmYwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWFhZWU1YWM0YTExNDc4MGIxYjFkNWU4ZTFmZTZmMDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlc3BlcmFkbzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjBkYTQ2NGQzMDgyNGU2MThhZjliOGM5ZmQ1ZjU3MTkuc2V0Q29udGVudChodG1sX2VhYWVlNWFjNGExMTQ3ODBiMWIxZDVlOGUxZmU2ZjA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FiMDBlODc2ZWQwZTRiZTc5YzM1NDRhNzQ2ZWQ0ODVjLmJpbmRQb3B1cChwb3B1cF9mMGRhNDY0ZDMwODI0ZTYxOGFmOWI4YzlmZDVmNTcxOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iY2VkY2VmYjcyZDE0NmU2YTJhNzYxOWRiNGFhNGU4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMjI2NDM3ODQxNzQ1LDguNDk1NTU3NjA5NTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjgzZDUyMTExN2Q0NGRkZjg2ZDcyMTIxNDRlMTQ3ODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2ZkNDQwMDEzMTczNDc4YWI2M2YxMWFhMzc2MWZhYjYgPSAkKCc8ZGl2IGlkPSJodG1sX2NmZDQ0MDAxMzE3MzQ3OGFiNjNmMTFhYTM3NjFmYWI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Pc3RlcmlhIGRhIEJpYWdpbzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjgzZDUyMTExN2Q0NGRkZjg2ZDcyMTIxNDRlMTQ3ODEuc2V0Q29udGVudChodG1sX2NmZDQ0MDAxMzE3MzQ3OGFiNjNmMTFhYTM3NjFmYWI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjZWRjZWZiNzJkMTQ2ZTZhMmE3NjE5ZGI0YWE0ZTgwLmJpbmRQb3B1cChwb3B1cF82ODNkNTIxMTE3ZDQ0ZGRmODZkNzIxMjE0NGUxNDc4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOWMzZDEyMjRkNDQ0ODEzOTY2MTQ2NTBjNzJmZGQ5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMzkzNTM1ODk3NzQ0LDguNDk2NTI0MTc0NzUwODA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzkwZWU5MCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMywKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YmJmYTlkZTA5Njc0ZjA5OGVjNWM0YjhmNjBiMTE4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZWM3ZWIzNDJjYmM0Y2VjYWFlMTBhZDA1NDg0NGQ0ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWVjN2ViMzQyY2JjNGNlY2FhZTEwYWQwNTQ4NDRkNGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFyZ2VudGluYSBTdGVha2hvdXNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YmJmYTlkZTA5Njc0ZjA5OGVjNWM0YjhmNjBiMTE4ZC5zZXRDb250ZW50KGh0bWxfYWVjN2ViMzQyY2JjNGNlY2FhZTEwYWQwNTQ4NDRkNGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjljM2QxMjI0ZDQ0NDgxMzk2NjE0NjUwYzcyZmRkOTEuYmluZFBvcHVwKHBvcHVwXzRiYmZhOWRlMDk2NzRmMDk4ZWM1YzRiOGY2MGIxMThkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiY2NkZDg3YTA0MTQxY2ViMmM4MjE1N2I1ODYwYjYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDcuNDAyNzc5MDI4NjI0MjgsOC40OTI0OTYwMTM2NDEzNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjOTBlZTkwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAzLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFiYmRkMzZhZGUzZTQ0YTdhZmRlYmRiOTI0MGM0YmMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhZTVhYjMyYWI4ZDQ0YmNhNDcyNjAxODMyNTYxMmYyID0gJCgnPGRpdiBpZD0iaHRtbF8yYWU1YWIzMmFiOGQ0NGJjYTQ3MjYwMTgzMjU2MTJmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFoYXJhbmk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiYmRkMzZhZGUzZTQ0YTdhZmRlYmRiOTI0MGM0YmMxLnNldENvbnRlbnQoaHRtbF8yYWU1YWIzMmFiOGQ0NGJjYTQ3MjYwMTgzMjU2MTJmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YmNjZGQ4N2EwNDE0MWNlYjJjODIxNTdiNTg2MGI2MS5iaW5kUG9wdXAocG9wdXBfMWJiZGQzNmFkZTNlNDRhN2FmZGViZGI5MjQwYzRiYzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk5OTcyZjBkMmUxNDEwYWEzYjFhZTdlYWRkMTM2YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDMwMDA4NDQ5Njk0MSw4LjQ5ODIwNjAxMTMwMDI2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdjNTg0MTliZTI2NDMwN2EzODFkYTc0MzkzOTIxMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjliOGJhNWUzYzViNGM0NmE0MDM3NWEwYjdjYjBhNTkgPSAkKCc8ZGl2IGlkPSJodG1sXzI5YjhiYTVlM2M1YjRjNDZhNDAzNzVhMGI3Y2IwYTU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJjZWxsbyYjMzk7cyBCaXN0cm88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3YzU4NDE5YmUyNjQzMDdhMzgxZGE3NDM5MzkyMTE4LnNldENvbnRlbnQoaHRtbF8yOWI4YmE1ZTNjNWI0YzQ2YTQwMzc1YTBiN2NiMGE1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTk5NzJmMGQyZTE0MTBhYTNiMWFlN2VhZGQxMzZiZi5iaW5kUG9wdXAocG9wdXBfNTdjNTg0MTliZTI2NDMwN2EzODFkYTc0MzkzOTIxMTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTk1NDdhNGJjM2VhNGE2ZDlkNjAxMWQwZjI5YTkxYzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4zOTkzNTI2NDQ2MjA0OSw4LjQ4OTM2MTI5MjQzMzYxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU4MDI3NTZmY2ViNGRlNTljNDdkYmQ2Yjg1MmRmYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQ0MmYyMjU0OTI1NDY5NTkyM2NkY2E0ZDVlZmZmMzkgPSAkKCc8ZGl2IGlkPSJodG1sXzY0NDJmMjI1NDkyNTQ2OTU5MjNjZGNhNGQ1ZWZmZjM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZXN0YXVyYW50IFdlcmRpbnNlbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDU4MDI3NTZmY2ViNGRlNTljNDdkYmQ2Yjg1MmRmYmUuc2V0Q29udGVudChodG1sXzY0NDJmMjI1NDkyNTQ2OTU5MjNjZGNhNGQ1ZWZmZjM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5NTQ3YTRiYzNlYTRhNmQ5ZDYwMTFkMGYyOWE5MWM2LmJpbmRQb3B1cChwb3B1cF80NTgwMjc1NmZjZWI0ZGU1OWM0N2RiZDZiODUyZGZiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYmFhZWRjYjI3ZjM0MmM3OGVkYTc1OWQ1MTI3YmVhOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ3LjQwMTY3MjIzMTg4NDg3NCw4LjQ5OTEyMTMwMTU4OTg5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmIwODBjN2Y5YzI5NGI2MmJmODlhOTNiNDgzYWVmYjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTI1YTk0MzU4OTYzNDA0OGI0ZGJkMTdjODJlYTc5NDQgPSAkKCc8ZGl2IGlkPSJodG1sXzkyNWE5NDM1ODk2MzQwNDhiNGRiZDE3YzgyZWE3OTQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaXp6ZXJpYSBSYXBpZG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiMDgwYzdmOWMyOTRiNjJiZjg5YTkzYjQ4M2FlZmI4LnNldENvbnRlbnQoaHRtbF85MjVhOTQzNTg5NjM0MDQ4YjRkYmQxN2M4MmVhNzk0NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmFhZWRjYjI3ZjM0MmM3OGVkYTc1OWQ1MTI3YmVhOS5iaW5kUG9wdXAocG9wdXBfNmIwODBjN2Y5YzI5NGI2MmJmODlhOTNiNDgzYWVmYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjNlNzAxMDcyMGI1NDM3NWFkMjZkMDU5NDQzODkyNzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny40MDAyODEyMSw4LjUwMzY4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM5MGVlOTAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDMsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWI5OTE1MjM3NDY5NGE1NWEwOWZiMzEyMjEwYjVjNDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmEwMzNkOWM3MWFkNDUzZmI3MmJkYWU3YzU5NDY2OGYgPSAkKCc8ZGl2IGlkPSJodG1sX2JhMDMzZDljNzFhZDQ1M2ZiNzJiZGFlN2M1OTQ2NjhmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWwgU29sZSBQaXp6YWt1cmllciBIw7ZuZ2c8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiOTkxNTIzNzQ2OTRhNTVhMDlmYjMxMjIxMGI1YzQyLnNldENvbnRlbnQoaHRtbF9iYTAzM2Q5YzcxYWQ0NTNmYjcyYmRhZTdjNTk0NjY4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82M2U3MDEwNzIwYjU0Mzc1YWQyNmQwNTk0NDM4OTI3Mi5iaW5kUG9wdXAocG9wdXBfMWI5OTE1MjM3NDY5NGE1NWEwOWZiMzEyMjEwYjVjNDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBwb2x5X2xpbmVfNzllNGJjMzZmZTBlNDA0OWI5OWIyZTZjODdlYjYwMWQgPSBMLnBvbHlsaW5lKAogICAgICAgICAgICAgICAgICAgIFtbNDcuNDA0MDU2MTUsIDguNDk1Mzc1ODAyODU2NzZdLCBbNDcuNDAzOTM1MzU4OTc3NDQsIDguNDk2NTI0MTc0NzUwODA1XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm5vQ2xpcCI6IGZhbHNlLAogICJvcGFjaXR5IjogMS4wLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfSkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHJlZ3VsYXJfcG9seWdvbl9tYXJrZXJfMGFkMjUwN2Q0YzFjNGRmOWI1NjFkOGVkMWIwNmY0MGIgPSBuZXcgTC5SZWd1bGFyUG9seWdvbk1hcmtlcigKICAgICAgICAgICAgICAgIG5ldyBMLkxhdExuZyg0Ny40MDM5OTU3NTQ0ODg3Miw4LjQ5NTk0OTk4ODgwMzc4MyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbiA6IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ2dyZWVuJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNpZGVzOiAzLAogICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiA4LjgzMzE4ODY3MDcyNDM0LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV9jZWFjZTI4NzNhNjY0NjQyYjIyZmM4YzYyODVkOWQ4MCA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDM5MzUzNTg5Nzc0NCwgOC40OTY1MjQxNzQ3NTA4MDVdLCBbNDcuNDAzNTIxLCA4LjQ5NDcwODRdXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl9kNDA0Y2E3OGExYTg0YzU3OTA5OTBlNWRmNDFhYzg5ZiA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMzcyODE3OTQ4ODcyLDguNDk1NjE2Mjg3Mzc1NDAyKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2lkZXM6IDMsCiAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IDE2MS4zNjg2MDUwMzE0ODgzNiwKICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBwb2x5X2xpbmVfOTI0NzZlNWFmZGY0NDU5ZDhlYjRmMDA2NzNhYzNlMjIgPSBMLnBvbHlsaW5lKAogICAgICAgICAgICAgICAgICAgIFtbNDcuNDAzNTIxLCA4LjQ5NDcwODRdLCBbNDcuNDA0MDU2MTUsIDguNDk1Mzc1ODAyODU2NzZdXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl85MGUzZDM5NDY1OTA0OTQwODgwODFhNTdmNjhkNDhlNCA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMzc4ODU3NSw4LjQ5NTA0MjEwMTQyODM4KSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAnZ3JlZW4nLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2lkZXM6IDMsCiAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IC00OS44MzI3NjE4MTU3ODYwMSwKICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBwb2x5X2xpbmVfNGEwYzU4MTE5OTdjNGI0YTgzNTYyZjRlZWEwNmFhMTEgPSBMLnBvbHlsaW5lKAogICAgICAgICAgICAgICAgICAgIFtbNDcuNDAzMTE3LCA4LjQ5MzY4MThdLCBbNDcuNDAyNzc5MDI4NjI0MjgsIDguNDkyNDk2MDEzNjQxMzU3XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAib3JhbmdlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl9kOGI2NDU2ODg1ODE0MGE0OWVlNjY5YWI5N2VjNzlhNCA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMjk0ODAxNDMxMjE0NSw4LjQ5MzA4ODkwNjgyMDY3NyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbiA6IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogMTU3LjE2NDMxNDk1Njc5MzAyLAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV9mYmNlZmRkZGIxNTk0N2QxYjA3N2M0ZmRjZWYyMzU5MyA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDI3NzkwMjg2MjQyOCwgOC40OTI0OTYwMTM2NDEzNTddLCBbNDcuNDAzNTIxLCA4LjQ5NDcwODRdXSwKICAgICAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJub0NsaXAiOiBmYWxzZSwKICAib3BhY2l0eSI6IDEuMCwKICAic21vb3RoRmFjdG9yIjogMS4wLAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0pLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciByZWd1bGFyX3BvbHlnb25fbWFya2VyX2MxZTJiZjVjOGU2YTQ0ZTc4NmRkYWE0ZDBiYzMwYWFiID0gbmV3IEwuUmVndWxhclBvbHlnb25NYXJrZXIoCiAgICAgICAgICAgICAgICBuZXcgTC5MYXRMbmcoNDcuNDAzMTUwMDE0MzEyMTQsOC40OTM2MDIyMDY4MjA2NzkpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb24gOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIHdlaWdodDogMiwKICAgICAgICAgICAgICAgICAgICBmaWxsQ29sb3I6ICdvcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2lkZXM6IDMsCiAgICAgICAgICAgICAgICAgICAgcm90YXRpb246IC0yNi4zNTkxOTc2NzY2MzYzNzcsCiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiA2CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgcG9seV9saW5lXzMxNzBhMGY4ZTkzYzQ3NGVhOTQ2NTNjNjgyNzFhYTAyID0gTC5wb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbWzQ3LjQwMzUyMSwgOC40OTQ3MDg0XSwgWzQ3LjQwMzExNywgOC40OTM2ODE4XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAib3JhbmdlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl81MjczNDViNTgzMDA0NGJhYmJiYTgwMWM5YjQ3YWIyOCA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMzMxODk5OTk5OTk5Niw4LjQ5NDE5NTA5OTk5OTk5OSksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbiA6IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ29yYW5nZScsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogMTQ5LjgyNTMyMDU1NTQyMTQ2LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICAgICAgdmFyIHBvbHlfbGluZV9mMjk4MjY5MjBlNjc0NjE4OTQzODg5ZmQ4NDRmZTc2YiA9IEwucG9seWxpbmUoCiAgICAgICAgICAgICAgICAgICAgW1s0Ny40MDQ1ODgyLCA4LjQ5NTY5OTNdLCBbNDcuNDAzOTM1MzU4OTc3NDQsIDguNDk2NTI0MTc0NzUwODA1XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl9hYTA4ZDE3MWZlYWE0YTJiYjQ2ZmQyYmRkYjdiNDMyYiA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwNDI2MTc3OTQ4ODcyLDguNDk2MTExNzM3Mzc1NDAyKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNpZGVzOiAzLAogICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiA0OS40NjM0OTE4OTI1OTY4OSwKICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgICAgIHZhciBwb2x5X2xpbmVfNWY2ZDVkZDg5ZGY5NGMwY2IwNGE2OWNmN2FlY2Y2NjcgPSBMLnBvbHlsaW5lKAogICAgICAgICAgICAgICAgICAgIFtbNDcuNDAzOTM1MzU4OTc3NDQsIDguNDk2NTI0MTc0NzUwODA1XSwgWzQ3LjQwMzUyMSwgOC40OTQ3MDg0XV0sCiAgICAgICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAibm9DbGlwIjogZmFsc2UsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInNtb290aEZhY3RvciI6IDEuMCwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9KS5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcmVndWxhcl9wb2x5Z29uX21hcmtlcl8wMjg0N2I1ZTc2Zjc0MzY1YThiMzAyMzE2NzVkOGFlYSA9IG5ldyBMLlJlZ3VsYXJQb2x5Z29uTWFya2VyKAogICAgICAgICAgICAgICAgbmV3IEwuTGF0TG5nKDQ3LjQwMzcyODE3OTQ4ODcyLDguNDk1NjE2Mjg3Mzc1NDAyKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uIDogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ6IDIsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNpZGVzOiAzLAogICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiAxNjEuMzY4NjA1MDMxNDg4MzYsCiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiA2CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF85OTliMmEyNmM5MWM0MGRjYTdhYTliZTljZWZmOTNjMSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgICAgICB2YXIgcG9seV9saW5lX2QwNmQyYWMxNWJmODQzNTU5YmRlOWNjN2ZjYWRiNzA5ID0gTC5wb2x5bGluZSgKICAgICAgICAgICAgICAgICAgICBbWzQ3LjQwMzUyMSwgOC40OTQ3MDg0XSwgWzQ3LjQwNDU4ODIsIDguNDk1Njk5M11dLAogICAgICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm5vQ2xpcCI6IGZhbHNlLAogICJvcGFjaXR5IjogMS4wLAogICJzbW9vdGhGYWN0b3IiOiAxLjAsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfSkuYWRkVG8obWFwXzk5OWIyYTI2YzkxYzQwZGNhN2FhOWJlOWNlZmY5M2MxKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHJlZ3VsYXJfcG9seWdvbl9tYXJrZXJfYjg2YTkyZDk0YzViNDQxODlkNzEwOTRkOWEyMzFjNWEgPSBuZXcgTC5SZWd1bGFyUG9seWdvbk1hcmtlcigKICAgICAgICAgICAgICAgIG5ldyBMLkxhdExuZyg0Ny40MDQwNTQ1OTk5OTk5OTUsOC40OTUyMDM4NSksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbiA6IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAyLAogICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTaWRlczogMywKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbjogLTU3Ljg1MzcxMzQzMzI2Njc1LAogICAgICAgICAgICAgICAgICAgIHJhZGl1czogNgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfOTk5YjJhMjZjOTFjNDBkY2E3YWE5YmU5Y2VmZjkzYzEpOwogICAgICAgICAgICAKPC9zY3JpcHQ+ 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 0x1a276c6850>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# draw base map with position markers\n", "folium_map=createRawMap(custLatitude_2, custLongitude_2, custAddr_2, helperData, venues_2, zoomStart=16)\n", "\n", "# add lines and arrows\n", "for pos in p:\n", " p1=[pos[0], pos[1]]\n", " p2=[pos[2], pos[3]]\n", " colorLine=pos[4]\n", " folium.PolyLine(locations=[p1, p2], color=colorLine).add_to(folium_map)\n", "\n", " arrows = get_arrows(locations=[p1, p2], color=colorLine, n_arrows=1)\n", " for arrow in arrows:\n", " arrow.add_to(folium_map)\n", " \n", "display(folium_map)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Very nice!\n", "\n", "If you want to try with a different customer adress, [simply jump here and have some fun](#tldr2).\n", "<a id = \"end\"></a>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### **For discussion and conclusion you can [have a look at the full report here](https://github.com/Funisher-code/Coursera_Capstone/blob/master/report/COVID-19_Safe_And_Efficient_Food_Deliveries.md).**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "\n", "### And now?\n", "\n", "The goal was to build a simple PoC of a recommender system.\n", "\n", "Goal achieved.\n", "\n", "But of course there is lots of room for improvement!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**I hope you enjoyed following the code as much as I did piecing it together.**\n", "\n", "If you have suggestions or remarks, you can reach me [here](https://www.linkedin.com/in/markus-maechler/).\n", "\n", "----" ] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }