Last active
June 12, 2020 11:20
-
-
Save sammko/3bce10656778e670629c2b63c62f7357 to your computer and use it in GitHub Desktop.
Intersection Test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"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.8.0" | |
}, | |
"colab": { | |
"name": "Intersection Test", | |
"provenance": [], | |
"collapsed_sections": [], | |
"include_colab_link": true | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/sammko/3bce10656778e670629c2b63c62f7357/intersection-test.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "owEDxcE6lqxu", | |
"colab_type": "code", | |
"outputId": "d95f1a1f-58ab-40f4-eab2-a54b394a9fea", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 102 | |
} | |
}, | |
"source": [ | |
"!pip install pygeodesy" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"Collecting pygeodesy\n", | |
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/3e/d2/8f880f1b22c2f308841448effcd48b69c9d883d744e394ce456ef977efd2/PyGeodesy-20.5.30-py2.py3-none-any.whl (367kB)\n", | |
"\u001b[K |████████████████████████████████| 368kB 2.9MB/s \n", | |
"\u001b[?25hInstalling collected packages: pygeodesy\n", | |
"Successfully installed pygeodesy-20.5.30\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "w8J1kPZAlk_H", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"import random\n", | |
"import folium\n", | |
"import itertools\n", | |
"from operator import itemgetter\n", | |
"from pygeodesy import sphericalNvector as snv\n", | |
"from math import cos, sin, acos, tan, radians, degrees" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "sMR5jt-5lk_L", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"def circ_intersect(s1, r1, s2, r2):\n", | |
" R = 6371008.77141\n", | |
" B = radians(s1.initialBearingTo(s2))\n", | |
" D = s1.distanceTo(s2)/R\n", | |
" a1 = r1/R\n", | |
" a2 = r2/R\n", | |
" tx = (cos(a2)/cos(a1)-cos(D))/sin(D)\n", | |
" try:\n", | |
" x = acos(tx/tan(a1))\n", | |
" except ValueError:\n", | |
" return ()\n", | |
" return (s1.destination(r1, degrees(B+x)), s1.destination(r1, degrees(B-x)))" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "exWVWVGClk_O", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"def rand_coords():\n", | |
" return snv.LatLon(random.random()*180-90, random.random()*360-180)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "MCFnTJPqlk_Q", | |
"colab_type": "code", | |
"colab": {} | |
}, | |
"source": [ | |
"def lltup(s):\n", | |
" return (s.lat, s.lon)" | |
], | |
"execution_count": 0, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "WdI635APlk_T", | |
"colab_type": "code", | |
"outputId": "0859ef1e-d690-4e11-f2a5-d51c36adb3a8", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 34 | |
} | |
}, | |
"source": [ | |
"N = 10\n", | |
"def test():\n", | |
" x = rand_coords()\n", | |
" centers = [rand_coords() for i in range(N)]\n", | |
" circles = [(center, center.distanceTo(x)) for center in centers]\n", | |
" points = []\n", | |
" for c1, c2 in itertools.combinations(circles, 2):\n", | |
" s1, r1 = c1\n", | |
" s2, r2 = c2\n", | |
" ins = circ_intersect(s1, r1, s2, r2)\n", | |
" ins = [(p, p.distanceTo(x)) for p in ins]\n", | |
" closest = min(ins, key=itemgetter(1))\n", | |
" points.append(closest)\n", | |
" #print(closest[0].distanceTo(x))\n", | |
" return x, circles, points\n", | |
"x, circles, points = test()\n", | |
"distances = lambda: map(itemgetter(1), points)\n", | |
"max(distances())" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"0.000508132531859604" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 6 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "3RrDysGslk_W", | |
"colab_type": "code", | |
"outputId": "0a059e69-4d13-493b-da09-79003a3be860", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 1000 | |
} | |
}, | |
"source": [ | |
"mymap = folium.Map()\n", | |
"for p, d in circles:\n", | |
" folium.Marker(lltup(p), icon=folium.Icon(color='red')).add_to(mymap)\n", | |
" folium.Circle(lltup(p), d, stroke=0.1).add_to(mymap)\n", | |
"folium.Marker(lltup(x)).add_to(mymap)\n", | |
"mymap" | |
], | |
"execution_count": 0, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkgPSBMLm1hcCgKICAgICAgICAnbWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5JywgewogICAgICAgIGNlbnRlcjogWzAsIDBdLAogICAgICAgIHpvb206IDEsCiAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgIH0pOwoKCiAgICAKICAgIHZhciB0aWxlX2xheWVyX2JjYjFiYTRjZWM1MDRlNzQ5YTkyOWViY2RmODE0ZTQ2ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICB7CiAgICAgICAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAgICAgICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgICAgICAgIm1heE5hdGl2ZVpvb20iOiAxOCwKICAgICAgICAibWF4Wm9vbSI6IDE4LAogICAgICAgICJtaW5ab29tIjogMCwKICAgICAgICAibm9XcmFwIjogZmFsc2UsCiAgICAgICAgIm9wYWNpdHkiOiAxLAogICAgICAgICJzdWJkb21haW5zIjogImFiYyIsCiAgICAgICAgInRtcyI6IGZhbHNlCn0pLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAKICAgICAgICB2YXIgbWFya2VyXzY5ZjY3ZTMxZGY4MjQzZmVhYzA3NDkwZWU5MjkxYjJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFsxOS41MjkzNjMxNzA4NzUxMywgNDUuOTQ1OTI5NTI0NjYwOTI2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzU3MGZjNTIwZjVmYzRkODVhYzg2MTI2NjZhNWI2ZmEwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfNjlmNjdlMzFkZjgyNDNmZWFjMDc0OTBlZTkyOTFiMmEuc2V0SWNvbihpY29uXzU3MGZjNTIwZjVmYzRkODVhYzg2MTI2NjZhNWI2ZmEwKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfOWUwZTMzZWFmOGVjNDFiZmFjZDcxMzU4NzFjMjNiMWYgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFsxOS41MjkzNjMxNzA4NzUxMywgNDUuOTQ1OTI5NTI0NjYwOTI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogOTYzNTU0NC41MDA2NjM3MDUsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VhZGIxNjliNzZiMzQyMDA5YjE1NDJmNzk5NjQzYzg3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFszMi41MDMwODY4NDcyNzY2MzQsIC0xMzQuMzA0NDA0MjMyOTc4MTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkpOwogICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fMDFmMmUxNThkYjk1NDg4ZjlhMTVjZTU4MzNmN2I2MDIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvLXNpZ24nLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl9lYWRiMTY5Yjc2YjM0MjAwOWIxNTQyZjc5OTY0M2M4Ny5zZXRJY29uKGljb25fMDFmMmUxNThkYjk1NDg4ZjlhMTVjZTU4MzNmN2I2MDIpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV81NTM4NDdiYWQzZWM0ZjQyYWRkNjNkYjY3ZDg1N2VhNiA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzMyLjUwMzA4Njg0NzI3NjYzNCwgLTEzNC4zMDQ0MDQyMzI5NzgxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDk2MTcxNDMuOTE1NjMxMjE2LAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jYzI2NWRlYjhjZmM0ZmVkODUwNGU4MThlM2Y5NzU1ZSA9IEwubWFya2VyKAogICAgICAgICAgICBbLTg4LjAyNTQyMTk0MTAxMjc0LCAtMTM3LjQ0MTA2OTMzNzA1NTEzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzdhYmE2Njk2NDZjMDQ1MjNhMzJhYWQ1NTE1NjI0ZWI1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfY2MyNjVkZWI4Y2ZjNGZlZDg1MDRlODE4ZTNmOTc1NWUuc2V0SWNvbihpY29uXzdhYmE2Njk2NDZjMDQ1MjNhMzJhYWQ1NTE1NjI0ZWI1KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfODU4NDgzYzhmMjI3NDFlOTkzNDQxZDhlMTBmZmEwNDUgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFstODguMDI1NDIxOTQxMDEyNzQsIC0xMzcuNDQxMDY5MzM3MDU1MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAxMDkxNzYxNC4xODU5ODYyNDMsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI0ODIyMjE2NGZiNDQ4NjJiMzJjOTFjNGY1ZDg5YmZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFstMjUuODc4MzMwODc0MDE2MDcyLCAtMC44Mzc1NDQ4NjEzMzAyNTgxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uX2MxMjFjYWNjNTM4NTQ4ODE5ZjlhOTE3MDkwMWM5ODRjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfMjQ4MjIyMTY0ZmI0NDg2MmIzMmM5MWM0ZjVkODliZmQuc2V0SWNvbihpY29uX2MxMjFjYWNjNTM4NTQ4ODE5ZjlhOTE3MDkwMWM5ODRjKTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfN2I3MjczMGYzMjM0NDA0Zjg4NzcyNjUwODAxOWNhYjEgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFstMjUuODc4MzMwODc0MDE2MDcyLCAtMC44Mzc1NDQ4NjEzMzAyNTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTk0MjUxOC40MDcwODA2NTksCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2M3ODhiMDIwZGVmZjQ0NzZhMTgzNThhMmZlNWU5OTQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs2LjQ3NjYzNTk1NzA0MDE3MywgLTIxLjgxODkxNjI2MTkyOTM4OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl83NjM3ZTVjZTE0OWM0YTVhOWE4YzU5MzVlMDM5YmQ4YiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2luZm8tc2lnbicsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyX2M3ODhiMDIwZGVmZjQ0NzZhMTgzNThhMmZlNWU5OTQ0LnNldEljb24oaWNvbl83NjM3ZTVjZTE0OWM0YTVhOWE4YzU5MzVlMDM5YmQ4Yik7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzQ3YWQzNDc3NWM3MDQwNTJhZmY4MGQzZDhkYjkwMWI2ID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNi40NzY2MzU5NTcwNDAxNzMsIC0yMS44MTg5MTYyNjE5MjkzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogZmFsc2UsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjIsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiAyMzgwNDU2LjU5Nzg5NzA1MzcsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I3YTE1NTQ3ZjY4MzRhMGZhMTc2MzgyOGEyZjI5ZmY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFstNDEuNDgyMjQ0MTM0NTMyNTg2LCAtMTQ0LjAxMTA2ODE2NjgwNzY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzI1ZmI4YzE0NzIwNDQxYjg4N2JiMzQ2YjdiMTVhYzA1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfYjdhMTU1NDdmNjgzNGEwZmExNzYzODI4YTJmMjlmZjYuc2V0SWNvbihpY29uXzI1ZmI4YzE0NzIwNDQxYjg4N2JiMzQ2YjdiMTVhYzA1KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfMDQ4ZTY0Zjg4OTE0NGYxMzg0YzQ3NGFlOTRhMjQyYzQgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFstNDEuNDgyMjQ0MTM0NTMyNTg2LCAtMTQ0LjAxMTA2ODE2NjgwNzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTE0ODYzNjAuMTE2NDQ2NTkyLAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82NDZhNWUyZTdjYTE0ODZkOTJhNTNmNTkyYWIxZDE0NiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDcuNDQ5OTk2MjA2NTM4MDksIDE1Ni40NzM2MzMyNzA5NjUwOF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgCiAgICAKCiAgICAgICAgICAgICAgICB2YXIgaWNvbl9lMGI4YWM4NjIwODE0YWRkOWZmOGQ2ZjE4MTczNzQwMyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbih7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2luZm8tc2lnbicsCiAgICAgICAgICAgICAgICAgICAgaWNvbkNvbG9yOiAnd2hpdGUnLAogICAgICAgICAgICAgICAgICAgIG1hcmtlckNvbG9yOiAncmVkJywKICAgICAgICAgICAgICAgICAgICBwcmVmaXg6ICdnbHlwaGljb24nLAogICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3NlczogJ2ZhLXJvdGF0ZS0wJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbWFya2VyXzY0NmE1ZTJlN2NhMTQ4NmQ5MmE1M2Y1OTJhYjFkMTQ2LnNldEljb24oaWNvbl9lMGI4YWM4NjIwODE0YWRkOWZmOGQ2ZjE4MTczNzQwMyk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgY2lyY2xlXzFjZGMxNTk0NmMwYTRkNmM4N2YzYzI3ZTc3NTcxZDcxID0gTC5jaXJjbGUoCiAgICAgICAgICAgICAgICBbNDcuNDQ5OTk2MjA2NTM4MDksIDE1Ni40NzM2MzMyNzA5NjUwOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiBmYWxzZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuMiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDEzNTQyMjIyLjg0NTI4NDc0LAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wOWYzZmQ2MzljYWY0Mjg4Yjc3OGI0ZjE0OTdjNWFkOSA9IEwubWFya2VyKAogICAgICAgICAgICBbLTI0LjAzMjEzODUxMDU0ODY5LCAtMTQ4LjcwNDM4NTY0NjIwMTNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkpOwogICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fM2ZiMzY4MGJmODFhNGE4NDllNjVjOTcwZGQ5MzliYzcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvLXNpZ24nLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wOWYzZmQ2MzljYWY0Mjg4Yjc3OGI0ZjE0OTdjNWFkOS5zZXRJY29uKGljb25fM2ZiMzY4MGJmODFhNGE4NDllNjVjOTcwZGQ5MzliYzcpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV81YTgxZGNiNzFjYTM0ZjFkODgxNjA0MTZlMWU5ZTg1NCA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWy0yNC4wMzIxMzg1MTA1NDg2OSwgLTE0OC43MDQzODU2NDYyMDEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogMTE5MjU3NTUuMjY0OTcwNDgzLAogICJzdHJva2UiOiAwLjEsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF9iOWNmOWZjZGYxNDM0Mzg5OTc0NTk0MDE0NzkzZjUxOSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wNjU2N2RjZWExYWM0YjllODk4Nzk1NTUxZDQ3MGE0ZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNTMuOTg4MTIwMDE2OTUxNDg0LCAtNzEuNjI0MDQ0MDQ5MzM5MDldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjljZjlmY2RmMTQzNDM4OTk3NDU5NDAxNDc5M2Y1MTkpOwogICAgICAgIAogICAgCgogICAgICAgICAgICAgICAgdmFyIGljb25fNGQ2NzQ0ZTc5MDg4NDBiZGFkOGMyNTcwZmVhZTk2NTIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oewogICAgICAgICAgICAgICAgICAgIGljb246ICdpbmZvLXNpZ24nLAogICAgICAgICAgICAgICAgICAgIGljb25Db2xvcjogJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICBtYXJrZXJDb2xvcjogJ3JlZCcsCiAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnZ2x5cGhpY29uJywKICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXM6ICdmYS1yb3RhdGUtMCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcl8wNjU2N2RjZWExYWM0YjllODk4Nzk1NTUxZDQ3MGE0ZC5zZXRJY29uKGljb25fNGQ2NzQ0ZTc5MDg4NDBiZGFkOGMyNTcwZmVhZTk2NTIpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIGNpcmNsZV9lMWI1YzdmNGM5ZTE0NjdiOTcyNmNkOWY5ZjBjZDY2NyA9IEwuY2lyY2xlKAogICAgICAgICAgICAgICAgWzUzLjk4ODEyMDAxNjk1MTQ4NCwgLTcxLjYyNDA0NDA0OTMzOTA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNTY5ODcxMi4wMTU2NDg1MzYsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdjMWI3YTQ1YmRlOTRkZDhiOTlkZjc4MGYzZTkyMTBjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFsyNS45NTcyNDA3NTM5NDUyNywgMTUuOTk4NzAwNzQwMzk1ODA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKICAgIAoKICAgICAgICAgICAgICAgIHZhciBpY29uXzBmNzYzMGZkNGFiYTRlMWI5YzY4ZmM3OTZjZjE3Mjc2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKHsKICAgICAgICAgICAgICAgICAgICBpY29uOiAnaW5mby1zaWduJywKICAgICAgICAgICAgICAgICAgICBpY29uQ29sb3I6ICd3aGl0ZScsCiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ29sb3I6ICdyZWQnLAogICAgICAgICAgICAgICAgICAgIHByZWZpeDogJ2dseXBoaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFDbGFzc2VzOiAnZmEtcm90YXRlLTAnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJfN2MxYjdhNDViZGU5NGRkOGI5OWRmNzgwZjNlOTIxMGMuc2V0SWNvbihpY29uXzBmNzYzMGZkNGFiYTRlMWI5YzY4ZmM3OTZjZjE3Mjc2KTsKICAgICAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBjaXJjbGVfZmE1YmU0MjZhN2U3NGRkMzg5NWM3OWQwZDM0Y2ZjMzkgPSBMLmNpcmNsZSgKICAgICAgICAgICAgICAgIFsyNS45NTcyNDA3NTM5NDUyNywgMTUuOTk4NzAwNzQwMzk1ODA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IGZhbHNlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC4yLAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNjU1OTE0OS44NjYzMTc5NTYsCiAgInN0cm9rZSI6IDAuMSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2UxZGY1NTY2ODQ3NjQ2ZDg5M2NhYjY1YWE1MTRkZTE0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs4LjA0ODA4NDY4MjA5NDUyNiwgLTQzLjM0NDUxNjgyNDA1MzgxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2I5Y2Y5ZmNkZjE0MzQzODk5NzQ1OTQwMTQ3OTNmNTE5KTsKICAgICAgICAKPC9zY3JpcHQ+ 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 0x7f41d0915048>" | |
] | |
}, | |
"metadata": { | |
"tags": [] | |
}, | |
"execution_count": 7 | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment