Crear Mapa Base


# Crear Mapa Base - Open Street Map

mapa_base = fl.Map()

# mapa_base.save("F:/DISCO3/Documents/python_folium/mapa_001.html")

mapa_base
Make this Notebook Trusted to load map: File -> Trust Notebook

Ubicación - Latitud - Longitud


# Ubicación - Latitud - Longitud

# Palacio Nacional de La República Dominicana 18.47474559888523, -69.89787861615132

palacio_nacional = fl.Map(location=[18.47474559888523, -69.89787861615132],zoom_start=16)

# palacio_nacional.save("F:/DISCO3/Documents/python_folium/mapa_002.html")

palacio_nacional
Make this Notebook Trusted to load map: File -> Trust Notebook

Tiles - Menú Tiles


# Tiles - Menú Tiles

# Palacio Nacional de La República Dominicana 18.47474559888523, -69.89787861615132

# Tiles: stamenterrain,stamenwatercolor,stamentoner,cartodbpositron, OpenStreetMap

palacio_nacional = fl.Map(location=[18.47474559888523, -69.89787861615132],zoom_start=16)

img_001 = "https://bit.ly/3IwJKkg"

FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional)
fl.Marker(location=[18.47474559888523, -69.89787861615132],
          icon=fl.Icon(color="darkblue",icon="ok-sign")).add_to(palacio_nacional)
fl.Circle(location=[18.47474559888523, -69.89787861615132],
          color="orange",fill_color="purple",fill_opacity=0.4,weight=4,radius=40).add_to(palacio_nacional)
fl.TileLayer("stamenterrain").add_to(palacio_nacional)
fl.TileLayer("stamentoner").add_to(palacio_nacional)
fl.TileLayer("stamenwatercolor").add_to(palacio_nacional)
fl.TileLayer("cartodbpositron").add_to(palacio_nacional)
fl.TileLayer("OpenStreetMap").add_to(palacio_nacional)
fl.LayerControl(position="bottomleft").add_to(palacio_nacional)

# palacio_nacional.save("F:/DISCO3/Documents/python_folium/mapa_004.html")
palacio_nacional
Make this Notebook Trusted to load map: File -> Trust Notebook

MiniMap Configuración


# MiniMap - Configuración

# Palacio Nacional de La República Dominicana 18.47474559888523, -69.89787861615132

palacio_nacional = fl.Map(location=[18.47474559888523, -69.89787861615132],zoom_start=16,tiles="cartodbpositron")

img_001 = "https://bit.ly/3IwJKkg"

FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional)
fl.Marker(location=[18.47474559888523, -69.89787861615132],
          icon=fl.Icon(color="darkblue",icon="ok-sign")).add_to(palacio_nacional)
fl.Circle(location=[18.47474559888523, -69.89787861615132],
          color="orange",fill_color="purple",fill_opacity=0.4,weight=4,radius=40).add_to(palacio_nacional)
minimap = MiniMap(tile_layer="cartodbpositron",position="bottomleft",toggle_display=True)

palacio_nacional.add_child(minimap)


# palacio_nacional.save("F:/DISCO3/Documents/python_folium/mapa_005.html")
Make this Notebook Trusted to load map: File -> Trust Notebook
palacio_nacional
Make this Notebook Trusted to load map: File -> Trust Notebook

Múltiples Marcadores - Caso I


# Múltiples Marcadores - Caso I

# Iglesia Nuestra Señora de La Merced,18.47416921486365,-69.88824745014279

# Convento Regina Angelorum,18.471116404923126,-69.8871531089362

# Puerta de la Misericordia,18.468775880481004,-69.89011426748678

# Palacio Nacional de La República Dominicana 18.47474559888523, -69.89787861615132

palacio_nacional = fl.Map(location=[18.47474559888523, -69.89787861615132],zoom_start=16)

img_001 = "https://bit.ly/3IwJKkg"

FloatImage(img_001,left=90,bottom=90).add_to(palacio_nacional)
fl.Marker(location=[18.47416921486365,-69.88824745014279],
          icon=fl.Icon(color="darkblue",icon="ok-sign")).add_to(palacio_nacional)
fl.Marker(location=[18.471116404923126,-69.8871531089362],
          icon=fl.Icon(color="orange",icon="fire")).add_to(palacio_nacional)
fl.Marker(location=[18.468775880481004,-69.89011426748678],
          icon=fl.Icon(color="purple",icon="cloud")).add_to(palacio_nacional)
fl.Marker(location=[18.47474559888523, -69.89787861615132],
          icon=fl.Icon(color="blue",icon="info-sign")).add_to(palacio_nacional)
minimap = MiniMap(position="bottomleft",toggle_display=True)

palacio_nacional.add_child(minimap)


# palacio_nacional.save("F:/DISCO3/Documents/python_folium/mapa_007.html")
Make this Notebook Trusted to load map: File -> Trust Notebook
palacio_nacional
Make this Notebook Trusted to load map: File -> Trust Notebook

Múltiples Marcadores - Caso II

# Multiples Marcadores - Data Frame - Caso II

parque_independencia_alrededores = fl.Map(location=[18.471279222825007, -69.89206691553046],zoom_start=16)


img_001 = "python_logo.png"

centro_dataframe = pd.DataFrame({'lugar':['Iglesia Nuestra Señora de La Merced','Convento Regina Angelorum','Puerta de la Misericordia'],
                                'latitud':[18.47416921486365,18.471116404923126,18.468775880481004],
                                'longitud':[-69.88824745014279,-69.8871531089362,-69.89011426748678],
                                'simbolo':['ok-sign','ok-sign','ok-sign'],
                                'color':['dark-blue','orange','blue']})

for i in centro_dataframe.itertuples():
    fl.Marker(location=[i.latitud,i.longitud],
              icon=fl.Icon(color=i.color,icon=i.simbolo),popup=fl.Popup(i.lugar,max_width=200)).add_to(parque_independencia_alrededores)
FloatImage(img_001,left=90,bottom=90).add_to(parque_independencia_alrededores)


# parque_independencia_alrededores.save("mapa_folium_008.html") Genera un archivo HTML que muestra el mapa
parque_independencia_alrededores
Make this Notebook Trusted to load map: File -> Trust Notebook

Múltiples Marcadores - Caso III


# Multiples Marcadores - Pandas (archivo.txt) - Caso III

parque_independencia_alrededores = fl.Map(location=[18.471279222825007, -69.89206691553046],zoom_start=16)


img_001 = "python_logo.png"


FloatImage(img_001,left=90,bottom=90).add_to(parque_independencia_alrededores)
puntos = pd.read_csv("puntos_dom.txt")

puntos
puntos_frame = pd.DataFrame(puntos)

for i in puntos_frame.itertuples():
    fl.Marker(location=[i.latitud,i.longitud],
              icon=fl.Icon(color=i.color,icon=i.simbolo),popup=fl.Popup(i.lugar,max_width=200)).add_to(parque_independencia_alrededores)
    
parque_independencia_alrededores    
Make this Notebook Trusted to load map: File -> Trust Notebook

Tutorial Folium - YouTube

# Incrustamos al documento un tutorial de YouTube haciendo uso de la librería vembedr

library(vembedr)

embed_url("https://www.youtube.com/watch?v=xl_OFx7BgtA") %>% 
   use_align("center") %>%
   use_rounded(10)
LS0tDQp0aXRsZTogIk1hcGFzIEludGVyYWN0aXZvIGVuIFB5dGhvbiINCmF1dGhvcjogIlJlbnpvIEPDoWNlcmVzIFJvc3NpIg0KZGF0ZTogIjIwMjIvMDMvMDEiDQpzdWJ0aXRsZTogRm9saXVtIC0gTGVhZmxldA0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHNlbGZfY29udGFpbmVkOiBubw0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCg0KPCEtLSBDcmVhciBNYXBhcyBJbnRlcmFjdGl2b3MgZW4gUHl0aG9uIGhhY2llbmRvIHVzbyBkZSBsYSBsaWJyZXLDrWEgRm9saXVtIC0tPg0KDQpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCmxpYnJhcnkocmV0aWN1bGF0ZSkNCg0KDQp1c2VfcHl0aG9uKCJDOi9Vc2Vycy9yZW56b3Jvc3Npdi9BcHBEYXRhL0xvY2FsL1Byb2dyYW1zL1B5dGhvbi9QeXRob24zMTAvcHl0aG9uLmV4ZSIpDQpgYGANCg0KYGBge3B5dGhvbiBpbmNsdWRlPUZBTFNFfQ0KIyBDcmVhciBNYXBhcyBJbnRlcmFjdGl2b3MgZW4gUHl0aG9uIC0gTGVhZmxldA0KDQojIExpYnJlcsOtYXMgRm9saXVtIC0gUGFuZGFzDQoNCiMgUGx1Z2luczogTWluaU1hcCAtIEZsb2F0SW1hZ2UNCg0KaW1wb3J0IGZvbGl1bSBhcyBmbA0KDQppbXBvcnQgcGFuZGFzIGFzIHBkDQoNCmZyb20gZm9saXVtLnBsdWdpbnMgaW1wb3J0IE1pbmlNYXANCg0KZnJvbSBmb2xpdW0ucGx1Z2lucyBpbXBvcnQgRmxvYXRJbWFnZQ0KYGBgDQoNCiMjIENyZWFyIE1hcGEgQmFzZSANCg0KYGBge3B5dGhvbixyZXN1bHRzPSdoaWRlJ30NCg0KIyBDcmVhciBNYXBhIEJhc2UgLSBPcGVuIFN0cmVldCBNYXANCg0KbWFwYV9iYXNlID0gZmwuTWFwKCkNCg0KIyBtYXBhX2Jhc2Uuc2F2ZSgiRjovRElTQ08zL0RvY3VtZW50cy9weXRob25fZm9saXVtL21hcGFfMDAxLmh0bWwiKQ0KDQptYXBhX2Jhc2UNCmBgYA0KDQojIyBVYmljYWNpw7NuIC0gTGF0aXR1ZCAtIExvbmdpdHVkDQoNCmBgYHtweXRob24gcmVzdWx0cz0naGlkZSd9DQoNCiMgVWJpY2FjacOzbiAtIExhdGl0dWQgLSBMb25naXR1ZA0KDQojIFBhbGFjaW8gTmFjaW9uYWwgZGUgTGEgUmVww7pibGljYSBEb21pbmljYW5hIDE4LjQ3NDc0NTU5ODg4NTIzLCAtNjkuODk3ODc4NjE2MTUxMzINCg0KcGFsYWNpb19uYWNpb25hbCA9IGZsLk1hcChsb2NhdGlvbj1bMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMl0sem9vbV9zdGFydD0xNikNCg0KIyBwYWxhY2lvX25hY2lvbmFsLnNhdmUoIkY6L0RJU0NPMy9Eb2N1bWVudHMvcHl0aG9uX2ZvbGl1bS9tYXBhXzAwMi5odG1sIikNCg0KcGFsYWNpb19uYWNpb25hbA0KYGBgDQoNCg0KIyMgTWFyY2Fkb3IgLSBDw61yY3VsbyAtIExvZ28NCg0KYGBge3B5dGhvbixyZXN1bHRzPSdoaWRlJ30NCg0KIyBNYXJjYWRvciBwZXJzb25hbGl6YWNpw7NuIC0gQ8OtcmN1bG8gLSBMb2dvDQoNCiMgUGFsYWNpbyBOYWNpb25hbCBkZSBMYSBSZXDDumJsaWNhIERvbWluaWNhbmEgMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMg0KDQpwYWxhY2lvX25hY2lvbmFsID0gZmwuTWFwKGxvY2F0aW9uPVsxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyXSx6b29tX3N0YXJ0PTE2KQ0KDQppbWdfMDAxID0gImh0dHBzOi8vYml0Lmx5LzNJd0pLa2ciDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMl0sDQogICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPSJkYXJrYmx1ZSIsaWNvbj0ib2stc2lnbiIpKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVsxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyXSwNCiAgICAgICAgICBjb2xvcj0ib3JhbmdlIixmaWxsX2NvbG9yPSJwdXJwbGUiLGZpbGxfb3BhY2l0eT0wLjQsd2VpZ2h0PTQscmFkaXVzPTQwKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KIyBwYWxhY2lvX25hY2lvbmFsLnNhdmUoIkY6L0RJU0NPMy9Eb2N1bWVudHMvcHl0aG9uX2ZvbGl1bS9tYXBhXzAwMy5odG1sIikNCg0KcGFsYWNpb19uYWNpb25hbA0KYGBgDQoNCg0KIyMgVGlsZXMgLSBNZW7DuiBUaWxlcw0KDQpgYGB7cHl0aG9uIHJlc3VsdHM9J2hpZGUnfQ0KDQojIFRpbGVzIC0gTWVuw7ogVGlsZXMNCg0KIyBQYWxhY2lvIE5hY2lvbmFsIGRlIExhIFJlcMO6YmxpY2EgRG9taW5pY2FuYSAxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyDQoNCiMgVGlsZXM6IHN0YW1lbnRlcnJhaW4sc3RhbWVud2F0ZXJjb2xvcixzdGFtZW50b25lcixjYXJ0b2RicG9zaXRyb24sIE9wZW5TdHJlZXRNYXANCg0KcGFsYWNpb19uYWNpb25hbCA9IGZsLk1hcChsb2NhdGlvbj1bMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMl0sem9vbV9zdGFydD0xNikNCg0KaW1nXzAwMSA9ICJodHRwczovL2JpdC5seS8zSXdKS2tnIg0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhwYWxhY2lvX25hY2lvbmFsKQ0KDQpmbC5NYXJrZXIobG9jYXRpb249WzE4LjQ3NDc0NTU5ODg4NTIzLCAtNjkuODk3ODc4NjE2MTUxMzJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249Im9rLXNpZ24iKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCmZsLkNpcmNsZShsb2NhdGlvbj1bMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMl0sDQogICAgICAgICAgY29sb3I9Im9yYW5nZSIsZmlsbF9jb2xvcj0icHVycGxlIixmaWxsX29wYWNpdHk9MC40LHdlaWdodD00LHJhZGl1cz00MCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCmZsLlRpbGVMYXllcigic3RhbWVudGVycmFpbiIpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsKQ0KDQpmbC5UaWxlTGF5ZXIoInN0YW1lbnRvbmVyIikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCmZsLlRpbGVMYXllcigic3RhbWVud2F0ZXJjb2xvciIpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsKQ0KDQpmbC5UaWxlTGF5ZXIoImNhcnRvZGJwb3NpdHJvbiIpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsKQ0KDQpmbC5UaWxlTGF5ZXIoIk9wZW5TdHJlZXRNYXAiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KZmwuTGF5ZXJDb250cm9sKHBvc2l0aW9uPSJib3R0b21sZWZ0IikuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCiMgcGFsYWNpb19uYWNpb25hbC5zYXZlKCJGOi9ESVNDTzMvRG9jdW1lbnRzL3B5dGhvbl9mb2xpdW0vbWFwYV8wMDQuaHRtbCIpDQoNCnBhbGFjaW9fbmFjaW9uYWwNCg0KYGBgDQoNCiMjIE1pbmlNYXAgQ29uZmlndXJhY2nDs24NCg0KYGBge3B5dGhvbiByZXN1bHRzPSdoaWRlJ30NCg0KIyBNaW5pTWFwIC0gQ29uZmlndXJhY2nDs24NCg0KIyBQYWxhY2lvIE5hY2lvbmFsIGRlIExhIFJlcMO6YmxpY2EgRG9taW5pY2FuYSAxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyDQoNCnBhbGFjaW9fbmFjaW9uYWwgPSBmbC5NYXAobG9jYXRpb249WzE4LjQ3NDc0NTU5ODg4NTIzLCAtNjkuODk3ODc4NjE2MTUxMzJdLHpvb21fc3RhcnQ9MTYsdGlsZXM9ImNhcnRvZGJwb3NpdHJvbiIpDQoNCmltZ18wMDEgPSAiaHR0cHM6Ly9iaXQubHkvM0l3SktrZyINCg0KRmxvYXRJbWFnZShpbWdfMDAxLGxlZnQ9OTAsYm90dG9tPTkwKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KZmwuTWFya2VyKGxvY2F0aW9uPVsxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyXSwNCiAgICAgICAgICBpY29uPWZsLkljb24oY29sb3I9ImRhcmtibHVlIixpY29uPSJvay1zaWduIikpLmFkZF90byhwYWxhY2lvX25hY2lvbmFsKQ0KDQpmbC5DaXJjbGUobG9jYXRpb249WzE4LjQ3NDc0NTU5ODg4NTIzLCAtNjkuODk3ODc4NjE2MTUxMzJdLA0KICAgICAgICAgIGNvbG9yPSJvcmFuZ2UiLGZpbGxfY29sb3I9InB1cnBsZSIsZmlsbF9vcGFjaXR5PTAuNCx3ZWlnaHQ9NCxyYWRpdXM9NDApLmFkZF90byhwYWxhY2lvX25hY2lvbmFsKQ0KDQptaW5pbWFwID0gTWluaU1hcCh0aWxlX2xheWVyPSJjYXJ0b2RicG9zaXRyb24iLHBvc2l0aW9uPSJib3R0b21sZWZ0Iix0b2dnbGVfZGlzcGxheT1UcnVlKQ0KDQpwYWxhY2lvX25hY2lvbmFsLmFkZF9jaGlsZChtaW5pbWFwKQ0KDQoNCiMgcGFsYWNpb19uYWNpb25hbC5zYXZlKCJGOi9ESVNDTzMvRG9jdW1lbnRzL3B5dGhvbl9mb2xpdW0vbWFwYV8wMDUuaHRtbCIpDQoNCnBhbGFjaW9fbmFjaW9uYWwNCmBgYA0KDQojIyBQb3B1cCBTZXR1cCAtIFRvb2x0aXANCg0KYGBge3B5dGhvbiwgcmVzdWx0cz0naGlkZSd9DQoNCiMgUG9wdXAgLSBUb29sdGlwIC0gUG9wdXAgQ29uZmlndXJhY2nDs24NCg0KIyBQYWxhY2lvIE5hY2lvbmFsIGRlIExhIFJlcMO6YmxpY2EgRG9taW5pY2FuYSAxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyDQoNCnBhbGFjaW9fbmFjaW9uYWwgPSBmbC5NYXAobG9jYXRpb249WzE4LjQ3NDc0NTU5ODg4NTIzLCAtNjkuODk3ODc4NjE2MTUxMzJdLHpvb21fc3RhcnQ9MTYpDQoNCmltZ18wMDEgPSAiaHR0cHM6Ly9iaXQubHkvM0l3SktrZyINCg0KRmxvYXRJbWFnZShpbWdfMDAxLGxlZnQ9OTAsYm90dG9tPTkwKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KaHRtbD0nJycNCjxicj4NCjxiPkx1Z2FyOlBhbGFjaW8gTmFjaW9uYWwgUmVwLiBEb208L2I+PGJyPg0KPGI+TGF0aXR1ZDoxOC40NzQ3NDU1OTg4ODUyMzwvYj48YnI+DQo8Yj5Mb25naXR1ZDotNjkuODk3ODc4NjE2MTUxMzI8L2I+PGJyPg0KPGI+VVJMOjxhIGhyZWY9J2h0dHBzOi8vYml0Lmx5LzNoZ0N5ZzMnIHRhcmdldD0nX2JsYW5rJz5QYWxhY2lvIE5hY2lvbmFsPC9hPjxicj48YnI+DQo8Y2VudGVyPjxpbWcgc3JjPSdodHRwczovL2JpdC5seS8zNnU1V05CJyB3aWR0aD0yMDAgaGVpZ2h0PTEwMD48L2NlbnRlcj4NCicnJw0KDQppZnJhbWUgPSBmbC5JRnJhbWUoaHRtbD1odG1sLHdpZHRoPTMwMCAsaGVpZ2h0PTI1MCkNCg0KDQpmbC5NYXJrZXIobG9jYXRpb249WzE4LjQ3NDc0NTU5ODg4NTIzLCAtNjkuODk3ODc4NjE2MTUxMzJdLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249Im9rLXNpZ24iKSxwb3B1cD1mbC5Qb3B1cChpZnJhbWUpKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KZmwuQ2lyY2xlKGxvY2F0aW9uPVsxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyXSwNCiAgICAgICAgICBjb2xvcj0ib3JhbmdlIixmaWxsX2NvbG9yPSJwdXJwbGUiLGZpbGxfb3BhY2l0eT0wLjQsd2VpZ2h0PTQscmFkaXVzPTQwLHRvb2x0aXA9IlBhbGFjaW8gTmFjaW9uYWwiKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KbWluaW1hcCA9IE1pbmlNYXAocG9zaXRpb249ImJvdHRvbWxlZnQiLHRvZ2dsZV9kaXNwbGF5PVRydWUpDQoNCnBhbGFjaW9fbmFjaW9uYWwuYWRkX2NoaWxkKG1pbmltYXApDQoNCg0KIyBwYWxhY2lvX25hY2lvbmFsLnNhdmUoIkY6L0RJU0NPMy9Eb2N1bWVudHMvcHl0aG9uX2ZvbGl1bS9tYXBhXzAwNi5odG1sIikNCg0KcGFsYWNpb19uYWNpb25hbA0KYGBgDQoNCg0KIyMgTcO6bHRpcGxlcyBNYXJjYWRvcmVzIC0gQ2FzbyBJDQoNCmBgYHtweXRob24gcmVzdWx0cz0naGlkZSd9DQoNCiMgTcO6bHRpcGxlcyBNYXJjYWRvcmVzIC0gQ2FzbyBJDQoNCiMgSWdsZXNpYSBOdWVzdHJhIFNlw7FvcmEgZGUgTGEgTWVyY2VkLDE4LjQ3NDE2OTIxNDg2MzY1LC02OS44ODgyNDc0NTAxNDI3OQ0KDQojIENvbnZlbnRvIFJlZ2luYSBBbmdlbG9ydW0sMTguNDcxMTE2NDA0OTIzMTI2LC02OS44ODcxNTMxMDg5MzYyDQoNCiMgUHVlcnRhIGRlIGxhIE1pc2VyaWNvcmRpYSwxOC40Njg3NzU4ODA0ODEwMDQsLTY5Ljg5MDExNDI2NzQ4Njc4DQoNCiMgUGFsYWNpbyBOYWNpb25hbCBkZSBMYSBSZXDDumJsaWNhIERvbWluaWNhbmEgMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMg0KDQpwYWxhY2lvX25hY2lvbmFsID0gZmwuTWFwKGxvY2F0aW9uPVsxOC40NzQ3NDU1OTg4ODUyMywgLTY5Ljg5Nzg3ODYxNjE1MTMyXSx6b29tX3N0YXJ0PTE2KQ0KDQppbWdfMDAxID0gImh0dHBzOi8vYml0Lmx5LzNJd0pLa2ciDQoNCkZsb2F0SW1hZ2UoaW1nXzAwMSxsZWZ0PTkwLGJvdHRvbT05MCkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCg0KZmwuTWFya2VyKGxvY2F0aW9uPVsxOC40NzQxNjkyMTQ4NjM2NSwtNjkuODg4MjQ3NDUwMTQyNzldLA0KICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj0iZGFya2JsdWUiLGljb249Im9rLXNpZ24iKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTguNDcxMTE2NDA0OTIzMTI2LC02OS44ODcxNTMxMDg5MzYyXSwNCiAgICAgICAgICBpY29uPWZsLkljb24oY29sb3I9Im9yYW5nZSIsaWNvbj0iZmlyZSIpKS5hZGRfdG8ocGFsYWNpb19uYWNpb25hbCkNCg0KZmwuTWFya2VyKGxvY2F0aW9uPVsxOC40Njg3NzU4ODA0ODEwMDQsLTY5Ljg5MDExNDI2NzQ4Njc4XSwNCiAgICAgICAgICBpY29uPWZsLkljb24oY29sb3I9InB1cnBsZSIsaWNvbj0iY2xvdWQiKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCmZsLk1hcmtlcihsb2NhdGlvbj1bMTguNDc0NzQ1NTk4ODg1MjMsIC02OS44OTc4Nzg2MTYxNTEzMl0sDQogICAgICAgICAgaWNvbj1mbC5JY29uKGNvbG9yPSJibHVlIixpY29uPSJpbmZvLXNpZ24iKSkuYWRkX3RvKHBhbGFjaW9fbmFjaW9uYWwpDQoNCg0KbWluaW1hcCA9IE1pbmlNYXAocG9zaXRpb249ImJvdHRvbWxlZnQiLHRvZ2dsZV9kaXNwbGF5PVRydWUpDQoNCnBhbGFjaW9fbmFjaW9uYWwuYWRkX2NoaWxkKG1pbmltYXApDQoNCg0KIyBwYWxhY2lvX25hY2lvbmFsLnNhdmUoIkY6L0RJU0NPMy9Eb2N1bWVudHMvcHl0aG9uX2ZvbGl1bS9tYXBhXzAwNy5odG1sIikNCg0KcGFsYWNpb19uYWNpb25hbA0KDQpgYGANCg0KIyMgTcO6bHRpcGxlcyBNYXJjYWRvcmVzIC0gQ2FzbyBJSQ0KDQpgYGB7cHl0aG9uIHJlc3VsdHM9J2hpZGUnfQ0KIyBNdWx0aXBsZXMgTWFyY2Fkb3JlcyAtIERhdGEgRnJhbWUgLSBDYXNvIElJDQoNCnBhcnF1ZV9pbmRlcGVuZGVuY2lhX2FscmVkZWRvcmVzID0gZmwuTWFwKGxvY2F0aW9uPVsxOC40NzEyNzkyMjI4MjUwMDcsIC02OS44OTIwNjY5MTU1MzA0Nl0sem9vbV9zdGFydD0xNikNCg0KDQppbWdfMDAxID0gInB5dGhvbl9sb2dvLnBuZyINCg0KY2VudHJvX2RhdGFmcmFtZSA9IHBkLkRhdGFGcmFtZSh7J2x1Z2FyJzpbJ0lnbGVzaWEgTnVlc3RyYSBTZcOxb3JhIGRlIExhIE1lcmNlZCcsJ0NvbnZlbnRvIFJlZ2luYSBBbmdlbG9ydW0nLCdQdWVydGEgZGUgbGEgTWlzZXJpY29yZGlhJ10sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYXRpdHVkJzpbMTguNDc0MTY5MjE0ODYzNjUsMTguNDcxMTE2NDA0OTIzMTI2LDE4LjQ2ODc3NTg4MDQ4MTAwNF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb25naXR1ZCc6Wy02OS44ODgyNDc0NTAxNDI3OSwtNjkuODg3MTUzMTA4OTM2MiwtNjkuODkwMTE0MjY3NDg2NzhdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltYm9sbyc6Wydvay1zaWduJywnb2stc2lnbicsJ29rLXNpZ24nXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzpbJ2RhcmstYmx1ZScsJ29yYW5nZScsJ2JsdWUnXX0pDQoNCmZvciBpIGluIGNlbnRyb19kYXRhZnJhbWUuaXRlcnR1cGxlcygpOg0KICAgIGZsLk1hcmtlcihsb2NhdGlvbj1baS5sYXRpdHVkLGkubG9uZ2l0dWRdLA0KICAgICAgICAgICAgICBpY29uPWZsLkljb24oY29sb3I9aS5jb2xvcixpY29uPWkuc2ltYm9sbykscG9wdXA9ZmwuUG9wdXAoaS5sdWdhcixtYXhfd2lkdGg9MjAwKSkuYWRkX3RvKHBhcnF1ZV9pbmRlcGVuZGVuY2lhX2FscmVkZWRvcmVzKQ0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhwYXJxdWVfaW5kZXBlbmRlbmNpYV9hbHJlZGVkb3JlcykNCg0KDQojIHBhcnF1ZV9pbmRlcGVuZGVuY2lhX2FscmVkZWRvcmVzLnNhdmUoIm1hcGFfZm9saXVtXzAwOC5odG1sIikgR2VuZXJhIHVuIGFyY2hpdm8gSFRNTCBxdWUgbXVlc3RyYSBlbCBtYXBhDQoNCnBhcnF1ZV9pbmRlcGVuZGVuY2lhX2FscmVkZWRvcmVzDQpgYGANCg0KIyMgTcO6bHRpcGxlcyBNYXJjYWRvcmVzIC0gQ2FzbyBJSUkNCg0KYGBge3B5dGhvbiwgcmVzdWx0cz0naGlkZSd9DQoNCiMgTXVsdGlwbGVzIE1hcmNhZG9yZXMgLSBQYW5kYXMgKGFyY2hpdm8udHh0KSAtIENhc28gSUlJDQoNCnBhcnF1ZV9pbmRlcGVuZGVuY2lhX2FscmVkZWRvcmVzID0gZmwuTWFwKGxvY2F0aW9uPVsxOC40NzEyNzkyMjI4MjUwMDcsIC02OS44OTIwNjY5MTU1MzA0Nl0sem9vbV9zdGFydD0xNikNCg0KDQppbWdfMDAxID0gInB5dGhvbl9sb2dvLnBuZyINCg0KDQpGbG9hdEltYWdlKGltZ18wMDEsbGVmdD05MCxib3R0b209OTApLmFkZF90byhwYXJxdWVfaW5kZXBlbmRlbmNpYV9hbHJlZGVkb3JlcykNCg0KcHVudG9zID0gcGQucmVhZF9jc3YoInB1bnRvc19kb20udHh0IikNCg0KcHVudG9zDQoNCnB1bnRvc19mcmFtZSA9IHBkLkRhdGFGcmFtZShwdW50b3MpDQoNCmZvciBpIGluIHB1bnRvc19mcmFtZS5pdGVydHVwbGVzKCk6DQogICAgZmwuTWFya2VyKGxvY2F0aW9uPVtpLmxhdGl0dWQsaS5sb25naXR1ZF0sDQogICAgICAgICAgICAgIGljb249ZmwuSWNvbihjb2xvcj1pLmNvbG9yLGljb249aS5zaW1ib2xvKSxwb3B1cD1mbC5Qb3B1cChpLmx1Z2FyLG1heF93aWR0aD0yMDApKS5hZGRfdG8ocGFycXVlX2luZGVwZW5kZW5jaWFfYWxyZWRlZG9yZXMpDQogICAgDQpwYXJxdWVfaW5kZXBlbmRlbmNpYV9hbHJlZGVkb3JlcyAgICANCg0KYGBgDQoNCg0KIyMgVHV0b3JpYWwgRm9saXVtIC0gWW91VHViZQ0KDQpgYGB7ciB2ZW1iZWRyfQ0KDQojIEluY3J1c3RhbW9zIGFsIGRvY3VtZW50byB1biB0dXRvcmlhbCBkZSBZb3VUdWJlIGhhY2llbmRvIHVzbyBkZSBsYSBsaWJyZXLDrWEgdmVtYmVkcg0KDQpsaWJyYXJ5KHZlbWJlZHIpDQoNCmVtYmVkX3VybCgiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj14bF9PRng3Qmd0QSIpICU+JSANCiAgIHVzZV9hbGlnbigiY2VudGVyIikgJT4lDQogICB1c2Vfcm91bmRlZCgxMCkNCg0KDQpgYGANCg0KDQoNCg==