<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>데이터공부</title>
    <link>https://bobo0829.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 05:32:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bo보bo</managingEditor>
    <item>
      <title>python을 사용하여 치킨집 주소 크롤링, folium으로 맵에 표시하기2 - 교촌치킨</title>
      <link>https://bobo0829.tistory.com/7</link>
      <description>&lt;p&gt;.CodeMirror { font-size: 14px; font-family :consolas; }&lt;/p&gt;
&lt;h4&gt;장모님치킨이 생각보다 매장 수가 적어서 남는 시간에 진행해본 두 번째 주소수집&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99EA043A5E3A6B7918&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;이렇게 전체 목록이 쭉 나와있어서 페이지별로 수집만 하면 됐던 장모님치킨과는 달리&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9960013C5E3A6B801B&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;교촌치킨은 지역을 선택해야 해서 초반엔 당황했다.&lt;/p&gt;
&lt;p&gt;이리저리 둘러보다 xml파일을 이용하여 수집 시작&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests
from bs4 import BeautifulSoup
import json
import folium
import urllib.request
from xml.etree.ElementTree import parse&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;url = &amp;#39;http://www.kyochon.com/shop/domestic.asp&amp;#39;
params = &amp;#39;sido1=&amp;#39;+&amp;#39;3&amp;#39;+&amp;#39;&amp;amp;sido2=&amp;#39;+&amp;#39;1&amp;#39;+&amp;#39;&amp;amp;txtsearch=&amp;#39;
url = url +&amp;#39;?&amp;#39;+params
namelist = list()
addrlist = list()
response = requests.get(url)
data = BeautifulSoup(response.content,&amp;#39;html.parser&amp;#39;)
shopdata=data.select(&amp;#39;ul.list&amp;#39;)[0]
# shopdata&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;shopdata.select(&amp;#39;strong&amp;#39;)[0].text
shopdata.select(&amp;#39;em&amp;#39;)[1].text.split(&amp;#39;\n&amp;#39;)[1].replace(&amp;#39;\t&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\r&amp;#39;,&amp;#39;&amp;#39;)
shopdata.select(&amp;#39;em&amp;#39;)[1].text.split(&amp;#39;\n&amp;#39;)[3].replace(&amp;#39;\t&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\r&amp;#39;,&amp;#39;&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;053-629-9994&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;addrdata = shopdata.select(&amp;#39;em&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;url = &amp;#39;http://www.kyochon.com/common/xml/district/sido.xml&amp;#39;
request = urllib.request.Request(url)
request.add_header(&amp;#39;User-Agent&amp;#39;,&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36&amp;#39;)
# headers={&amp;#39;User-Agent&amp;#39;: &amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36&amp;#39;}
data = urllib.request.urlopen(request).read()
soup = BeautifulSoup(data)
sido_all=soup.find_all(&amp;#39;sidolist&amp;#39;)
silist=list()
for sido in sido_all:
    silist.append(sido.find(&amp;#39;sidonm&amp;#39;).text)
silist
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[&amp;#39;서울&amp;#39;,
 &amp;#39;부산&amp;#39;,
 &amp;#39;대구&amp;#39;,
 &amp;#39;인천&amp;#39;,
 &amp;#39;광주&amp;#39;,
 &amp;#39;대전&amp;#39;,
 &amp;#39;울산&amp;#39;,
 &amp;#39;세종&amp;#39;,
 &amp;#39;경기&amp;#39;,
 &amp;#39;강원&amp;#39;,
 &amp;#39;충북&amp;#39;,
 &amp;#39;충남&amp;#39;,
 &amp;#39;전북&amp;#39;,
 &amp;#39;전남&amp;#39;,
 &amp;#39;경북&amp;#39;,
 &amp;#39;경남&amp;#39;,
 &amp;#39;제주&amp;#39;]&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;sidict=dict()
sidict[1]=&amp;#39;seoul&amp;#39;
sidict[2]=&amp;#39;busan&amp;#39;
sidict[3]=&amp;#39;daegoo&amp;#39;
sidict[4]=&amp;#39;incheon&amp;#39;
sidict[5]=&amp;#39;gwangjoo&amp;#39;
sidict[6]=&amp;#39;daejeon&amp;#39;
sidict[7]=&amp;#39;woolsan&amp;#39;
sidict[8]=&amp;#39;sejong&amp;#39;
sidict[9]=&amp;#39;gyeongi&amp;#39;
sidict[10]=&amp;#39;gangwon&amp;#39;
sidict[11]=&amp;#39;choongbook&amp;#39;
sidict[12]=&amp;#39;choongnam&amp;#39;
sidict[13]=&amp;#39;jeonbook&amp;#39;
sidict[14]=&amp;#39;jeonnam&amp;#39;
sidict[15]=&amp;#39;gyeongbook&amp;#39;
sidict[16]=&amp;#39;gyeongnam&amp;#39;
sidict[17]=&amp;#39;jeju&amp;#39;
# sidict&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;dolist=list()
dodict=dict()
for i in range(1,len(silist)+1):
    url = &amp;#39;http://www.kyochon.com/common/xml/district/{}.xml&amp;#39;.format(sidict[i])
    request = urllib.request.Request(url)
    request.add_header(&amp;#39;User-Agent&amp;#39;,&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36&amp;#39;)
    # headers={&amp;#39;User-Agent&amp;#39;: &amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36&amp;#39;}
    data = urllib.request.urlopen(request).read()
    soup = BeautifulSoup(data)
    do_all = soup.find_all(&amp;#39;sigungulist&amp;#39;)
    j = 0

    for do in do_all:
        j+=1
    dolist.append(j)
    dodict[i]=j
dodict
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{1: 25,
 2: 16,
 3: 8,
 4: 10,
 5: 5,
 6: 5,
 7: 5,
 8: 14,
 9: 44,
 10: 18,
 11: 15,
 12: 17,
 13: 15,
 14: 22,
 15: 24,
 16: 22,
 17: 2}&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;url = &amp;#39;http://www.kyochon.com/common/xml/district/seoul.xml&amp;#39;
request = urllib.request.Request(url)
request.add_header(&amp;#39;User-Agent&amp;#39;,&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36&amp;#39;)
# headers={&amp;#39;User-Agent&amp;#39;: &amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36&amp;#39;}
data = urllib.request.urlopen(request).read()
soup = BeautifulSoup(data)
do_all = soup.find_all(&amp;#39;sigungulist&amp;#39;)
i = 0
for do in do_all:
    i+=1
i&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;25&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;namelist=list()
addrlist=list()
shopdict=dict()
numlist=list()
for i in range(1,len(silist)+1):
    for j in range(1,dodict[i]+1):
        url = &amp;#39;http://www.kyochon.com/shop/domestic.asp&amp;#39;
        params = &amp;#39;sido1=&amp;#39;+str(i)+&amp;#39;&amp;amp;sido2=&amp;#39;+str(j)+&amp;#39;&amp;amp;txtsearch=&amp;#39;
        url = url +&amp;#39;?&amp;#39;+params

        response = requests.get(url)
        data = BeautifulSoup(response.content,&amp;#39;html.parser&amp;#39;)

        shopdata=data.select(&amp;#39;ul.list&amp;#39;)[0]
        addrdata = shopdata.select(&amp;#39;em&amp;#39;)
        namedata = shopdata.select(&amp;#39;strong&amp;#39;)
        numdata = shopdata.select(&amp;#39;em&amp;#39;)
        for k in range(0,len(addrdata)):
            name = namedata[k].text
            addr = addrdata[k].text.split(&amp;#39;\n&amp;#39;)[1].replace(&amp;#39;\t&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\r&amp;#39;,&amp;#39;&amp;#39;)
            num = numdata[k].text.split(&amp;#39;\n&amp;#39;)[3].replace(&amp;#39;\t&amp;#39;,&amp;#39;&amp;#39;).replace(&amp;#39;\r&amp;#39;,&amp;#39;&amp;#39;)
            namelist.append(name+&amp;#39;점&amp;#39;)
            addrlist.append(addr)
            numlist.append(num)
            shopdict[&amp;#39;name&amp;#39;]=addr
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;print(len(namelist),len(addrlist),len(numlist))
# print(addrlist)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1177 1177 1177&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;리스트들의 길이가 딱 맞게 나오면 기분이 참 좋다&lt;/p&gt;
&lt;p&gt;그런데 불과 한 두 달 전에 했을 때 보다 매장이 40개 이상 늘었다.&lt;/p&gt;
&lt;h4&gt;전에 사용했던 대로 카카오api를 이용하여 카카오맵으로 위경도 수집&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with open(&amp;#39;account_id.json&amp;#39;,&amp;#39;r&amp;#39;)as f:
    data = f.read()
    json_data = json.loads(data) #str -&amp;gt;obj
    app_id = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_id&amp;#39;]
    app_key = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_key&amp;#39;]
    #print(app_id,app_key)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def getLatLng(addr):
    with open(&amp;#39;account_id.json&amp;#39;,&amp;#39;r&amp;#39;)as f:
        data = f.read()
        json_data = json.loads(data) #str -&amp;gt;obj
        app_id = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_id&amp;#39;]
        app_key = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_key&amp;#39;]

    app_key = &amp;#39;KakaoAK &amp;#39;+ app_key
    url = &amp;#39;https://dapi.kakao.com/v2/local/search/address.json?query=&amp;#39;+addr
    headers = {&amp;#39;Authorization&amp;#39; : app_key}
    result = requests.get(url, headers=headers)
    result_json = json.loads(str(result.text))

    x=result_json[&amp;#39;documents&amp;#39;][0][&amp;#39;address&amp;#39;][&amp;#39;x&amp;#39;]
    y=result_json[&amp;#39;documents&amp;#39;][0][&amp;#39;address&amp;#39;][&amp;#39;y&amp;#39;]

    return(y,x)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;print(namelist)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;잘 들어있지만 리스트가 너무 긴 이유로 생략&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;i=0
for j in addrlist:
    print(i)
    (y,x)=getLatLng(j)
    i+=1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;전과 같은 방법으로 나오지 않는 주소는 한땀 한땀 수정..&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;addrlist[29]=&amp;#39;서울 강서구 강서로 429 마곡오드카운티1차 111호&amp;#39;
addrlist[71]=&amp;#39;서울 도봉구 도당로 32&amp;#39;
addrlist[100]=&amp;#39;서울 서대문구 냉천동 227&amp;#39;
addrlist[176]=&amp;#39;서울 종로구 종로 294&amp;#39;
addrlist[196]=&amp;#39;부산 금정구 금강로 270&amp;#39;
addrlist[209]=&amp;#39;부산 남구 용호로 185&amp;#39;
addrlist[242]=&amp;#39;부산 사상구 모라동 1349-4&amp;#39;
addrlist[271]=&amp;#39;부산 영도구 남항동 2가 40-1&amp;#39;
addrlist[318]=&amp;#39;대구 동구 동부로30길 27&amp;#39;
addrlist[331]=&amp;#39;대구 북구 호암로 6&amp;#39;
addrlist[365]=&amp;#39;대구 중구 남산로 49&amp;#39;
addrlist[385]=&amp;#39;인천 남동구 담방로21번길 3&amp;#39;
addrlist[394]=&amp;#39;인천 남동구 담방로21번길 3&amp;#39;
addrlist[410]=&amp;#39;인천 서구 검단로459번길 7-3&amp;#39;
addrlist[412]=&amp;#39;인천 서구 완정로 18&amp;#39;
addrlist[440]=&amp;#39;광주 남구 봉선중앙로 135-1&amp;#39;
addrlist[467]=&amp;#39;대전 대덕구 한남로12번길 19-9&amp;#39;
addrlist[537]=&amp;#39;세종특별자치시 보듬3로 8-29&amp;#39;
addrlist[551]=&amp;#39;경기 고양시 일산서구 일산로 486&amp;#39;
addrlist[594]=&amp;#39;경기 남양주시 경춘로 384&amp;#39;
addrlist[614]=&amp;#39;경기 부천시 소향로 25&amp;#39;
addrlist[706]=&amp;#39;경기 남양주시 경춘로 384&amp;#39;
addrlist[754]=&amp;#39;경기 의정부시 동일로 468&amp;#39;
addrlist[757]=&amp;#39;경기 이천시 부발읍 경충대로2050번길 15-60&amp;#39;
addrlist[821]=&amp;#39;강원 원주시 무실로 117&amp;#39;
addrlist[831]=&amp;#39;강원 춘천시 효자로 115&amp;#39;
addrlist[843]=&amp;#39;충북 음성군 금왕읍 무극로 204-1&amp;#39;
addrlist[870]=&amp;#39;충북 청주시 흥덕구 오송읍 오송생명로 200&amp;#39;
addrlist[890]=&amp;#39;충남 서산시 대산읍 구진로 27&amp;#39;
addrlist[1066]=&amp;#39;경남 거제시 아주로 68&amp;#39;
addrlist[1092]=&amp;#39;경남 사천시 사천읍 진삼로 1431&amp;#39;
addrlist[1122]=&amp;#39;경남 창원시 마산합포구 진동면 진동사동로 16&amp;#39;
addrlist[1156]=&amp;#39;제주특별자치도 서귀포시 일주동로 8584&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#(y,x)=getLatLng(&amp;#39;주소&amp;#39;)
#ylist=list()
#xlist=list()
#chicken_map = folium.Map(location=(y,x),zoom_start=9)
# for i in range(0,len(addrlist)):
#    (y,x)=getLatLng(addrlist[i])
#    ylist.append(y)
#    xlist.append(x)
#    folium.Marker((y,x),
#    popup=namelist[i],icon=folium.Icon(color=&amp;#39;lightred&amp;#39;,icon=&amp;#39;glyphicon glyphicon-cutlery&amp;#39;)).add_to(chicken_map)

# chicken_map&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;지도에 마커로 교촌/교촌+장모님 (색구분) 위치를 찍었지만 노트북으로 업로드 하기가 힘들어서 결국 파일로 첨부한다&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;확실히 장모님에 비해 전국적이며 압도적으로 많다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;장모님치킨 데이터를 가져와서 마커 합체&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9967204B5E3A6D3F1D&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99EFA3355E3A6D4717&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;브랜드 2개밖에 찍지 않았는데 치킨집으로 지도가 뒤덮였다.&lt;/p&gt;
&lt;p&gt;.dataframe tbody tr th:only-of-type { vertical-align: middle;&lt;/x-turndown&gt;&lt;/p&gt;</description>
      <author>bo보bo</author>
      <guid isPermaLink="true">https://bobo0829.tistory.com/7</guid>
      <comments>https://bobo0829.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 5 Feb 2020 16:24:01 +0900</pubDate>
    </item>
    <item>
      <title>python을 사용하여 치킨집 주소 크롤링, folium으로 맵에 표시하기 - 장모님치킨</title>
      <link>https://bobo0829.tistory.com/4</link>
      <description>&lt;h5&gt;수업 때 진행했던 내용이지만 처음으로 처음부터 끝까지 혼자 크롤링 해본 자료라 당시에 정말 재밌게 했던 것 같다.&lt;/h5&gt;
&lt;!-- 폰트변경 --&gt;

&lt;style type='text/css'&gt;
.CodeMirror {
    font-size: 14px; font-family :consolas;
}
&lt;/style&gt;




&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests
from bs4 import BeautifulSoup
import json
import folium&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;url = &amp;#39;http://jangmonim.co.kr/bizdemo33985/store/sub1.php?&amp;amp;com_board_search_code=&amp;amp;com_board_search_value1=&amp;amp;com_board_search_value2=&amp;amp;com_board_page=10&amp;amp;&amp;amp;com_board_id=4&amp;amp;&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_search_code=&amp;amp;com_board_search_value1=&amp;amp;com_board_search_value2=&amp;amp;com_board_page=&amp;#39;
page=1
url= url+str(page)
namelist = list()
addrlist = list()
response = requests.get(url)
data = BeautifulSoup(response.content,&amp;#39;html.parser&amp;#39;)
data = data.find(&amp;#39;table&amp;#39;)

name_all = data.select(&amp;#39;td.bbsnewf5&amp;#39;)
len(name_all)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;데이터가 너무 길어서 생략&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;태그를 보고  전화번호, 매장이름 , 매장주소 추출&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;data.select(&amp;#39;td.bbsetc_add1&amp;#39;)[0].text
data.select(&amp;#39;td.bbsnewf5&amp;#39;)[0].text.replace(&amp;#39;\n&amp;#39;,&amp;#39;&amp;#39;).strip()
data.select(&amp;#39;td.bbsetc_add2&amp;#39;)[0].text&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;055-884-0133&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;namelist = list()
addrlist = list()
numlist = list()
for i in range(1,14):
    url = &amp;#39;http://jangmonim.co.kr/bizdemo33985/store/sub1.php?&amp;amp;com_board_search_code=&amp;amp;com_board_search_value1=&amp;amp;com_board_search_value2=&amp;amp;com_board_page=10&amp;amp;&amp;amp;com_board_id=4&amp;amp;&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_category_code=c15&amp;amp;com_board_search_code=&amp;amp;com_board_search_value1=&amp;amp;com_board_search_value2=&amp;amp;com_board_page=&amp;#39;
    page=i
    url = url+str(page)


    response = requests.get(url)
    data = BeautifulSoup(response.content,&amp;#39;html.parser&amp;#39;)
    data = data.find(&amp;#39;table&amp;#39;)
    name_all = data.select(&amp;#39;td.bbsnewf5&amp;#39;)
    for j in range(0,len(name_all)):
        namelist.append(data.select(&amp;#39;td.bbsnewf5&amp;#39;)[j].text.replace(&amp;#39;\n&amp;#39;,&amp;#39;&amp;#39;).strip())
        addrlist.append(data.select(&amp;#39;td.bbsetc_add1&amp;#39;)[j].text)
        numlist.append(data.select(&amp;#39;td.bbsetc_add2&amp;#39;)[j].text)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;검색이 되지 않는 주소들의 리스트 번호를 알아낸 후, 카카오맵 기준으로 찾아서 수정&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;print(len(namelist),len(addrlist))
addrlist[19]=&amp;#39;경남 합천군 쌍책면 성산리 622&amp;#39;
addrlist[58]=&amp;#39;경상남도 창원시 성산구 사파동 93&amp;#39;
addrlist[62]=&amp;#39;경상남도 창원시 의창구 팔용동 123-2&amp;#39;
addrlist[69]=&amp;#39;경상남도 창원시 성산구 남양동 24&amp;#39;
addrlist[78]=&amp;#39;경남 함안군 법수면 윤내리 442-2&amp;#39;
addrlist[81]=&amp;#39;경상남도 의령군 유곡면 송산리 1525-1&amp;#39;
addrlist[82]=&amp;#39;경남 의령군 정곡면 중교리 420-1&amp;#39;
addrlist[87]=&amp;#39;경남 창원시 마산합포구 산호동 336-5&amp;#39;
addrlist[108]=&amp;#39;밀양시 삼랑진읍 송지리 156-115&amp;#39;
addrlist[113]=&amp;#39;경상남도 양산시 중부동 696-1&amp;#39;
addrlist[123]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;124 124

&amp;#39;경남 김해시 대성동 135-14&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;미리 발급받아놓은 카카오api 불러오기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with open(&amp;#39;account_id.json&amp;#39;,&amp;#39;r&amp;#39;)as f:
    data = f.read()
    json_data = json.loads(data) #str -&amp;gt;obj
    app_id = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_id&amp;#39;]
    app_key = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_key&amp;#39;]
   # print(app_id,app_key)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def getLatLng(addr):
    with open(&amp;#39;account_id.json&amp;#39;,&amp;#39;r&amp;#39;)as f:
        data = f.read()
        json_data = json.loads(data) #str -&amp;gt;obj
        app_id = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_id&amp;#39;]
        app_key = json_data[&amp;#39;kakao&amp;#39;][&amp;#39;app_key&amp;#39;]

    app_key = &amp;#39;KakaoAK &amp;#39;+ app_key
    url = &amp;#39;https://dapi.kakao.com/v2/local/search/address.json?query=&amp;#39;+addr
    headers = {&amp;#39;Authorization&amp;#39; : app_key}
    result = requests.get(url, headers=headers)
    result_json = json.loads(str(result.text))

    x=result_json[&amp;#39;documents&amp;#39;][0][&amp;#39;address&amp;#39;][&amp;#39;x&amp;#39;]
    y=result_json[&amp;#39;documents&amp;#39;][0][&amp;#39;address&amp;#39;][&amp;#39;y&amp;#39;]

    return(y,x)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;함수를 사용하면 한번에 되지 않음 -&amp;gt; 주소가 한변에 변환이 되지 않음&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# (y,x)=getLatLng(&amp;#39;경남 김해시 대성동 135-14&amp;#39;)
# map_thej = folium.Map(location=(y,x),zoom_start=17)
# map_thej&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;변환되지 않는 주소의 인덱스 찾기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# i = 0
# for j in addrlist:
#     print(i)
#     (y,x)=getLatLng(j)
#     i+=1&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;(y,x)=getLatLng(&amp;#39;경상남도 창원시 의창구 북면 마산리&amp;#39;)
ylist=list()
xlist=list()
chicken_map = folium.Map(location=(y,x),zoom_start=9)
for i in range(0,len(addrlist)):
    (y,x)=getLatLng(addrlist[i])
    ylist.append(y)
    xlist.append(x)
    folium.Marker((y,x), popup =namelist[i],icon=folium.Icon(color=&amp;#39;lightred&amp;#39;,icon=&amp;#39;glyphicon glyphicon-cutlery&amp;#39;)).add_to(chicken_map)

chicken_map&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;width:100%;&quot;&gt;&lt;div style=&quot;position:relative;width:100%;height:0;padding-bottom:60%;&quot;&gt;&lt;iframe src=&quot;data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjUuMS9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjUuMS9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0ZiB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFszNS4zMzk5NTU0MTU0NDM4MiwgMTI4LjYyMTc5NTYzNjEwOTU0XSwKICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3LAogICAgICAgICAgICAgICAgICAgIHpvb206IDksCiAgICAgICAgICAgICAgICAgICAgem9vbUNvbnRyb2w6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgcHJlZmVyQ2FudmFzOiBmYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9kNzgzODY3YzY0MGE0NTc2ODI4YjljODRjMDIxNzk2MSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgImh0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIiwKICAgICAgICAgICAgICAgIHsiYXR0cmlidXRpb24iOiAiRGF0YSBieSBcdTAwMjZjb3B5OyBcdTAwM2NhIGhyZWY9XCJodHRwOi8vb3BlbnN0cmVldG1hcC5vcmdcIlx1MDAzZU9wZW5TdHJlZXRNYXBcdTAwM2MvYVx1MDAzZSwgdW5kZXIgXHUwMDNjYSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIlx1MDAzZU9EYkxcdTAwM2MvYVx1MDAzZS4iLCAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsICJtYXhOYXRpdmVab29tIjogMTgsICJtYXhab29tIjogMTgsICJtaW5ab29tIjogMCwgIm5vV3JhcCI6IGZhbHNlLCAib3BhY2l0eSI6IDEsICJzdWJkb21haW5zIjogImFiYyIsICJ0bXMiOiBmYWxzZX0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2ViOTBlZTM5MmMwNDUxNWIxOGNlNTQzMzlkMjJlZmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNC45OTcyMjI4MjM3NjIzODUsIDEyNy44MTA4MzcyMjgyNjI3Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZTA5NzgxM2U2MmM3NDZiNzk5ZjYwNDVhYzVlYTVhOTAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl83ZWI5MGVlMzkyYzA0NTE1YjE4Y2U1NDMzOWQyMmVmYi5zZXRJY29uKGljb25fZTA5NzgxM2U2MmM3NDZiNzk5ZjYwNDVhYzVlYTVhOTApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Q0NWZhNzZlNzE2YTQ3NTI5ZTVlZmVjNjBlYmUxZjA0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83OGI5NzU4MmE5ODY0MmYxOTEzYjU5ZmUwYjIzN2VkMCA9ICQoYDxkaXYgaWQ9Imh0bWxfNzhiOTc1ODJhOTg2NDJmMTkxM2I1OWZlMGIyMzdlZDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuq4iOuCqOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kNDVmYTc2ZTcxNmE0NzUyOWU1ZWZlYzYwZWJlMWYwNC5zZXRDb250ZW50KGh0bWxfNzhiOTc1ODJhOTg2NDJmMTkxM2I1OWZlMGIyMzdlZDApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2ViOTBlZTM5MmMwNDUxNWIxOGNlNTQzMzlkMjJlZmIuYmluZFBvcHVwKHBvcHVwX2Q0NWZhNzZlNzE2YTQ3NTI5ZTVlZmVjNjBlYmUxZjA0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlkZWRhOTllNDU1YjRlODZhNDg0ODk3NjIxMGRkNmM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMTg2Njg2ODg5MDQxMDcsIDEyOC4wNzAwMjMxMjg2MDY4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kMmUyYzViNDhhYmU0ZjVlYTA5YTAyNzRlMzBlZDVlNCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzlkZWRhOTllNDU1YjRlODZhNDg0ODk3NjIxMGRkNmM3LnNldEljb24oaWNvbl9kMmUyYzViNDhhYmU0ZjVlYTA5YTAyNzRlMzBlZDVlNCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMzNhZjI3ZDk5NmQ5NGE4M2FhZGRhMjllNTViZWU3ZTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2EyOTNkN2M1Njc4YzQwYjViNGFiOWE4ODZiZTcwZGJkID0gJChgPGRpdiBpZD0iaHRtbF9hMjkzZDdjNTY3OGM0MGI1YjRhYjlhODg2YmU3MGRiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Iug7JWI7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzMzYWYyN2Q5OTZkOTRhODNhYWRkYTI5ZTU1YmVlN2U5LnNldENvbnRlbnQoaHRtbF9hMjkzZDdjNTY3OGM0MGI1YjRhYjlhODg2YmU3MGRiZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85ZGVkYTk5ZTQ1NWI0ZTg2YTQ4NDg5NzYyMTBkZDZjNy5iaW5kUG9wdXAocG9wdXBfMzNhZjI3ZDk5NmQ5NGE4M2FhZGRhMjllNTViZWU3ZTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWIyZDQ5MThiYjYxNDRhMmIzMDA4ZjczNTExMTY5N2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zODU0MzMyMDAyMzE4OSwgMTI4LjU3MDI5NjU0NTg4NzU3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl84ZmNlYjRkZDdhMTg0YTJjYjk2ZGU3ZTNlOWZlYmU4MSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzFiMmQ0OTE4YmI2MTQ0YTJiMzAwOGY3MzUxMTE2OTdjLnNldEljb24oaWNvbl84ZmNlYjRkZDdhMTg0YTJjYjk2ZGU3ZTNlOWZlYmU4MSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGRmNDMxY2ZkY2QxNDdmMDkwZTRhMjVlZTA2NmRhMzMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2M0NTUwMDZhOWM0NDRlYmRhMTc2Yjg1N2U1M2M0MzBjID0gJChgPGRpdiBpZD0iaHRtbF9jNDU1MDA2YTljNDQ0ZWJkYTE3NmI4NTdlNTNjNDMwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6ri46rOh7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzhkZjQzMWNmZGNkMTQ3ZjA5MGU0YTI1ZWUwNjZkYTMzLnNldENvbnRlbnQoaHRtbF9jNDU1MDA2YTljNDQ0ZWJkYTE3NmI4NTdlNTNjNDMwYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xYjJkNDkxOGJiNjE0NGEyYjMwMDhmNzM1MTExNjk3Yy5iaW5kUG9wdXAocG9wdXBfOGRmNDMxY2ZkY2QxNDdmMDkwZTRhMjVlZTA2NmRhMzMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmJmYWVjYjYwNDI4NGVkNGFkNDc2OTZiNDY0Zjg1NjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4wNTczOTc5NzA0ODA3ODUsIDEyNy45NjE2NzkyMDM1NjI2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl85ODQ5NzMwMjA3NTI0ZjU5YTlhMWI1YTY1Nzc5MWI5OCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2JiZmFlY2I2MDQyODRlZDRhZDQ3Njk2YjQ2NGY4NTYzLnNldEljb24oaWNvbl85ODQ5NzMwMjA3NTI0ZjU5YTlhMWI1YTY1Nzc5MWI5OCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDVjNmY3NzBhMWI1NDZkMjhmMGNmMTRlYWM1MTIyNzkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzkwNDAyZjI2ZWU2MTQ0NTA5MWFiYTIzMmE5M2FhOTA0ID0gJChgPGRpdiBpZD0iaHRtbF85MDQwMmYyNmVlNjE0NDUwOTFhYmEyMzJhOTNhYTkwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6rOk7JaR7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA1YzZmNzcwYTFiNTQ2ZDI4ZjBjZjE0ZWFjNTEyMjc5LnNldENvbnRlbnQoaHRtbF85MDQwMmYyNmVlNjE0NDUwOTFhYmEyMzJhOTNhYTkwNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9iYmZhZWNiNjA0Mjg0ZWQ0YWQ0NzY5NmI0NjRmODU2My5iaW5kUG9wdXAocG9wdXBfMDVjNmY3NzBhMWI1NDZkMjhmMGNmMTRlYWM1MTIyNzkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmUwMGYyNDI4ZmNhNGJmODgyZWIzNGU5NmFhNTUxNWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xMTkxMDgyNjE3NjU3NSwgMTI4LjQ4ODMxNTE2OTc1MTYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8zOGRmOWNjODY2MTg0YzRkOTIzZjg5ZDA4NzUwMTdhNyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzZlMDBmMjQyOGZjYTRiZjg4MmViMzRlOTZhYTU1MTVhLnNldEljb24oaWNvbl8zOGRmOWNjODY2MTg0YzRkOTIzZjg5ZDA4NzUwMTdhNyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2Y2NDVjMWZkNGRlNDNkYmJkODIzMDdkYTUxOWQ0YTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzRhZGE1NzUxOGI5OTQwMGU5NWUyMDMxYmNkZTcxMjk2ID0gJChgPGRpdiBpZD0iaHRtbF80YWRhNTc1MThiOTk0MDBlOTVlMjAzMWJjZGU3MTI5NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7KeE64+Z7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzNmNjQ1YzFmZDRkZTQzZGJiZDgyMzA3ZGE1MTlkNGEyLnNldENvbnRlbnQoaHRtbF80YWRhNTc1MThiOTk0MDBlOTVlMjAzMWJjZGU3MTI5Nik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82ZTAwZjI0MjhmY2E0YmY4ODJlYjM0ZTk2YWE1NTE1YS5iaW5kUG9wdXAocG9wdXBfM2Y2NDVjMWZkNGRlNDNkYmJkODIzMDdkYTUxOWQ0YTIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDcyZDJiZDlkZjEyNGE2MWFkNWY0NGFhMDAzMzUzOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMzA3Nzk0NDAyNzMxMiwgMTI4Ljg4NDQ1ODQwNjY4OTYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kODIzNGJmM2EwZDQ0NDQ4YjZkZTk5YzUwMzI1YWI0ZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzA3MmQyYmQ5ZGYxMjRhNjFhZDVmNDRhYTAwMzM1MzkwLnNldEljb24oaWNvbl9kODIzNGJmM2EwZDQ0NDQ4YjZkZTk5YzUwMzI1YWI0Zik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWJhMzcxMzk3NzgzNDVlYjhjZjEwZTZlZTk0NWUwOWMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzBjNmIzM2I5Y2IwYjRlZGE4MjZjN2EwODcwYTE2MTExID0gJChgPGRpdiBpZD0iaHRtbF8wYzZiMzNiOWNiMGI0ZWRhODI2YzdhMDg3MGExNjExMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6rmA7ZW067aA7JuQ7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2ViYTM3MTM5Nzc4MzQ1ZWI4Y2YxMGU2ZWU5NDVlMDljLnNldENvbnRlbnQoaHRtbF8wYzZiMzNiOWNiMGI0ZWRhODI2YzdhMDg3MGExNjExMSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wNzJkMmJkOWRmMTI0YTYxYWQ1ZjQ0YWEwMDMzNTM5MC5iaW5kUG9wdXAocG9wdXBfZWJhMzcxMzk3NzgzNDVlYjhjZjEwZTZlZTk0NWUwOWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzdmNGFmZTFmODQ4NGM5ODllM2ZlZDIxMGU3Y2FmNGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zNTI4MzczNzg5MjE2NSwgMTI5LjA0NjcwOTc1NDM3NjM0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl83NzMzM2U0NTVjYjY0Y2I4ODI0ODAwY2JkMWMwNTdjNCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzM3ZjRhZmUxZjg0ODRjOTg5ZTNmZWQyMTBlN2NhZjRkLnNldEljb24oaWNvbl83NzMzM2U0NTVjYjY0Y2I4ODI0ODAwY2JkMWMwNTdjNCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMGExZWJjODFiMTViNGZjOTlkMmVlNTIwYjkzY2RlYzYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzhiNmNlM2IwNWQxYTQ1NzU4MGQ2M2MxMGVjMmJlZWVjID0gJChgPGRpdiBpZD0iaHRtbF84YjZjZTNiMDVkMWE0NTc1ODBkNjNjMTBlYzJiZWVlYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Iug6riw7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzBhMWViYzgxYjE1YjRmYzk5ZDJlZTUyMGI5M2NkZWM2LnNldENvbnRlbnQoaHRtbF84YjZjZTNiMDVkMWE0NTc1ODBkNjNjMTBlYzJiZWVlYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zN2Y0YWZlMWY4NDg0Yzk4OWUzZmVkMjEwZTdjYWY0ZC5iaW5kUG9wdXAocG9wdXBfMGExZWJjODFiMTViNGZjOTlkMmVlNTIwYjkzY2RlYzYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmVmY2NlMzI0MmU4NDdmNmExMjIxYjE0OGI0ZjVmNWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zMDU0MzI2MjE5MTE4MSwgMTI4LjgyNDA5MzMzOTMzOTc4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9jYzA3ZTJkZjBkNTI0MDdjODgwZmM3Y2M5OGZiMjBjMCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2ZlZmNjZTMyNDJlODQ3ZjZhMTIyMWIxNDhiNGY1ZjVkLnNldEljb24oaWNvbl9jYzA3ZTJkZjBkNTI0MDdjODgwZmM3Y2M5OGZiMjBjMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODcxMjdmNDc2OTI4NDAwMjg1Mjc3OGU2MzRlMjM2NDMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzFkNDUzMmUzYWZhNjRkYzI4ZDQyZTM5MmNmNGE4N2YwID0gJChgPGRpdiBpZD0iaHRtbF8xZDQ1MzJlM2FmYTY0ZGMyOGQ0MmUzOTJjZjRhODdmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7JWI7ZWY7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg3MTI3ZjQ3NjkyODQwMDI4NTI3NzhlNjM0ZTIzNjQzLnNldENvbnRlbnQoaHRtbF8xZDQ1MzJlM2FmYTY0ZGMyOGQ0MmUzOTJjZjRhODdmMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mZWZjY2UzMjQyZTg0N2Y2YTEyMjFiMTQ4YjRmNWY1ZC5iaW5kUG9wdXAocG9wdXBfODcxMjdmNDc2OTI4NDAwMjg1Mjc3OGU2MzRlMjM2NDMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTRlMDRjNmExNDk5NDg4NThkZmRkNjM3YmZlZmIwNmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS41NTU2NDk2Njg3NzExMjUsIDEyOC40NjY5MTA2Nzg1OTU3OF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYTJmMDVhOTYwMGI5NDRmZmJlMzA2YjE1MDE1MTU4YWUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9hNGUwNGM2YTE0OTk0ODg1OGRmZGQ2MzdiZmVmYjA2Zi5zZXRJY29uKGljb25fYTJmMDVhOTYwMGI5NDRmZmJlMzA2YjE1MDE1MTU4YWUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFhNjE1NmJmMjlmNDQ5MjQ5NjM3N2I5MjkwYjczZTQ4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9iYjkxZGYyZjU5MmY0OWRlYjEyZTUzMzdkMmQxZWI0YSA9ICQoYDxkaXYgaWQ9Imh0bWxfYmI5MWRmMmY1OTJmNDlkZWIxMmU1MzM3ZDJkMWViNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuMgOyngOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xYTYxNTZiZjI5ZjQ0OTI0OTYzNzdiOTI5MGI3M2U0OC5zZXRDb250ZW50KGh0bWxfYmI5MWRmMmY1OTJmNDlkZWIxMmU1MzM3ZDJkMWViNGEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYTRlMDRjNmExNDk5NDg4NThkZmRkNjM3YmZlZmIwNmYuYmluZFBvcHVwKHBvcHVwXzFhNjE1NmJmMjlmNDQ5MjQ5NjM3N2I5MjkwYjczZTQ4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQ1OWQxZTJlN2I1YzQzN2RiMjhmNDcwOTEwZWYzNmU4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjA4NTkxNzI4NDY3MDYsIDEyOC42MjY0ODczODU1NDI5M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZDQ2ZjFjYmM2NGE0NGVhNzkzYzZiMzFlMGE1OTg3ZWMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl80NTlkMWUyZTdiNWM0MzdkYjI4ZjQ3MDkxMGVmMzZlOC5zZXRJY29uKGljb25fZDQ2ZjFjYmM2NGE0NGVhNzkzYzZiMzFlMGE1OTg3ZWMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI0NWZlMGUwYzRjMzQxM2NiZTFkMzBiZjNiYTdiMWUwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jYmViNGFiNWIyNjQ0ZjBlYTQ1NDIzOTk1NjZiOGY1OCA9ICQoYDxkaXYgaWQ9Imh0bWxfY2JlYjRhYjViMjY0NGYwZWE0NTQyMzk5NTY2YjhmNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyLoOy0jOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8yNDVmZTBlMGM0YzM0MTNjYmUxZDMwYmYzYmE3YjFlMC5zZXRDb250ZW50KGh0bWxfY2JlYjRhYjViMjY0NGYwZWE0NTQyMzk5NTY2YjhmNTgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDU5ZDFlMmU3YjVjNDM3ZGIyOGY0NzA5MTBlZjM2ZTguYmluZFBvcHVwKHBvcHVwXzI0NWZlMGUwYzRjMzQxM2NiZTFkMzBiZjNiYTdiMWUwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Q3ODg1ODhlODY5MzRjYTBhNmM3OGM1YmFjOGNlYjdiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjQ1MDc4OTUwNzEwNCwgMTI4Ljg3NDA0NTc4NjIxNjczXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9lNTdjOGM1OTUwYmU0ZWNmYjgyMjIwM2YyZTMwOGJjMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2Q3ODg1ODhlODY5MzRjYTBhNmM3OGM1YmFjOGNlYjdiLnNldEljb24oaWNvbl9lNTdjOGM1OTUwYmU0ZWNmYjgyMjIwM2YyZTMwOGJjMSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWNkYjNhYmZiNDFmNDlkMmFiMjc4YzJiNjMzODMyNWYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY2ZjUxZTExODI2ZjQ1NWY4NWYxMDk0MzEwNzhiMDY2ID0gJChgPGRpdiBpZD0iaHRtbF82NmY1MWUxMTgyNmY0NTVmODVmMTA5NDMxMDc4YjA2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6rWs7IKw7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VjZGIzYWJmYjQxZjQ5ZDJhYjI3OGMyYjYzMzgzMjVmLnNldENvbnRlbnQoaHRtbF82NmY1MWUxMTgyNmY0NTVmODVmMTA5NDMxMDc4YjA2Nik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kNzg4NTg4ZTg2OTM0Y2EwYTZjNzhjNWJhYzhjZWI3Yi5iaW5kUG9wdXAocG9wdXBfZWNkYjNhYmZiNDFmNDlkMmFiMjc4YzJiNjMzODMyNWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjljOTNlYzUwMDEwNGU0MWJkNDVjZTA4ZmI1OTkyZjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xNjE0OTEyNzUyODk4NCwgMTI3LjcwOTU3NDUzNDEyNzA3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9jNmY3OGMzMjcyZmU0NzZkYWQ3NWFlZjRhNTY5Njg4NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2Y5YzkzZWM1MDAxMDRlNDFiZDQ1Y2UwOGZiNTk5MmYzLnNldEljb24oaWNvbl9jNmY3OGMzMjcyZmU0NzZkYWQ3NWFlZjRhNTY5Njg4NCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDE4NGNjOTk3Y2NjNDRhNTgwMjFkZTViMTE1MDRkN2MgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzk0OWFmYzFlMWNhMzQzOGZiMzBjNDI0NjE2MzJmZjNiID0gJChgPGRpdiBpZD0iaHRtbF85NDlhZmMxZTFjYTM0MzhmYjMwYzQyNDYxNjMyZmYzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7JWF7JaR7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQxODRjYzk5N2NjYzQ0YTU4MDIxZGU1YjExNTA0ZDdjLnNldENvbnRlbnQoaHRtbF85NDlhZmMxZTFjYTM0MzhmYjMwYzQyNDYxNjMyZmYzYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mOWM5M2VjNTAwMTA0ZTQxYmQ0NWNlMDhmYjU5OTJmMy5iaW5kUG9wdXAocG9wdXBfNDE4NGNjOTk3Y2NjNDRhNTgwMjFkZTViMTE1MDRkN2MpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWRiYTNjNmQ0ZDU2NGU5NTkwNGJjYTVjM2YwN2Y4ZmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNC45NDg2NzE2NDA0MjM1NiwgMTI3Ljg3NzMyNDM1MDIwNTY0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9jMTdkZDU4OGQ1YzU0NDRlODYzYzcxYzZmZDI0MDM5MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2FkYmEzYzZkNGQ1NjRlOTU5MDRiY2E1YzNmMDdmOGZjLnNldEljb24oaWNvbl9jMTdkZDU4OGQ1YzU0NDRlODYzYzcxYzZmZDI0MDM5Myk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjRhMTRlY2I2ZmI3NDYwYjkxZTVkOWY2MmQ0OWI0N2MgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2RkZTdlZDE0NGZhZTQyMDA5MTg0YjZjZjU0ODZmODI4ID0gJChgPGRpdiBpZD0iaHRtbF9kZGU3ZWQxNDRmYWU0MjAwOTE4NGI2Y2Y1NDg2ZjgyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64Ko7ZW064yA6rWQ7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI0YTE0ZWNiNmZiNzQ2MGI5MWU1ZDlmNjJkNDliNDdjLnNldENvbnRlbnQoaHRtbF9kZGU3ZWQxNDRmYWU0MjAwOTE4NGI2Y2Y1NDg2ZjgyOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hZGJhM2M2ZDRkNTY0ZTk1OTA0YmNhNWMzZjA3ZjhmYy5iaW5kUG9wdXAocG9wdXBfMjRhMTRlY2I2ZmI3NDYwYjkxZTVkOWY2MmQ0OWI0N2MpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjdjODUyYmNjNjAyNDM5YzhiNTBkNjQ1NWZiMGFmODUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zMjYwMTM3MDkzODEzNjQsIDEyOC44NDkxMzAwNjE1MjU3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9mZTNiMjQ3Mjg0YTQ0NmUxOTYwMjZmYjlmZTc2YzQyOCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzY3Yzg1MmJjYzYwMjQzOWM4YjUwZDY0NTVmYjBhZjg1LnNldEljb24oaWNvbl9mZTNiMjQ3Mjg0YTQ0NmUxOTYwMjZmYjlmZTc2YzQyOCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNWJhNTk3NzFiNzg2NDA4MThjMjFhY2E0YzZhZWFiMTggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzgxN2U4ODk0NWFlODQ4MzI5YzZhOGNhMzBkN2IwN2I1ID0gJChgPGRpdiBpZD0iaHRtbF84MTdlODg5NDVhZTg0ODMyOWM2YThjYTMwZDdiMDdiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7IOd66a87KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzViYTU5NzcxYjc4NjQwODE4YzIxYWNhNGM2YWVhYjE4LnNldENvbnRlbnQoaHRtbF84MTdlODg5NDVhZTg0ODMyOWM2YThjYTMwZDdiMDdiNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82N2M4NTJiY2M2MDI0MzljOGI1MGQ2NDU1ZmIwYWY4NS5iaW5kUG9wdXAocG9wdXBfNWJhNTk3NzFiNzg2NDA4MThjMjFhY2E0YzZhZWFiMTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzI3YWFhOWYyMjc0NGIzMDllOTU2MjgzMWMxMmVhZjcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xNDE0NTQzODI1MzAzNywgMTI4LjcwNTA2Nzk4ODU2NjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzgyODAzMmE2MTE5NzRjZmM4YWM4NTIzM2M3ZTk2MWU4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMzI3YWFhOWYyMjc0NGIzMDllOTU2MjgzMWMxMmVhZjcuc2V0SWNvbihpY29uXzgyODAzMmE2MTE5NzRjZmM4YWM4NTIzM2M3ZTk2MWU4KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yOGMxOWMyM2Y4OWE0NjRkOTk2YTc2NmUwOWYxZTA1NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjVkMGUzZGMwY2FjNGYxOWJkMzE2OGNjYTJjYTE4ODcgPSAkKGA8ZGl2IGlkPSJodG1sX2I1ZDBlM2RjMGNhYzRmMTliZDMxNjhjY2EyY2ExODg3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7snpDsnYDsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjhjMTljMjNmODlhNDY0ZDk5NmE3NjZlMDlmMWUwNTUuc2V0Q29udGVudChodG1sX2I1ZDBlM2RjMGNhYzRmMTliZDMxNjhjY2EyY2ExODg3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMyN2FhYTlmMjI3NDRiMzA5ZTk1NjI4MzFjMTJlYWY3LmJpbmRQb3B1cChwb3B1cF8yOGMxOWMyM2Y4OWE0NjRkOTk2YTc2NmUwOWYxZTA1NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kN2QyZmQ0ODJhZTE0MGFlODBmMDU0OGI1NWRmMjFjYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjM0NjY4MDkzODkyMzQ4LCAxMjguNjA3MzA5NTkxODQwNjVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2Q1YTJiZTA1NDA5YTRkOTJiM2Q2NzI5YzUzMmM2ODVlID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZDdkMmZkNDgyYWUxNDBhZTgwZjA1NDhiNTVkZjIxY2Euc2V0SWNvbihpY29uX2Q1YTJiZTA1NDA5YTRkOTJiM2Q2NzI5YzUzMmM2ODVlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lYjFiNzc0YjVkNjY0NTk5YWIyZWQyNDVmOWFjMTE1MiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzliN2M1NTAyMWIxNGE3ODg1ZGE0ZDY1NTJhOTg2YzcgPSAkKGA8ZGl2IGlkPSJodG1sX2M5YjdjNTUwMjFiMTRhNzg4NWRhNGQ2NTUyYTk4NmM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rtoHrqbTsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWIxYjc3NGI1ZDY2NDU5OWFiMmVkMjQ1ZjlhYzExNTIuc2V0Q29udGVudChodG1sX2M5YjdjNTUwMjFiMTRhNzg4NWRhNGQ2NTUyYTk4NmM3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Q3ZDJmZDQ4MmFlMTQwYWU4MGYwNTQ4YjU1ZGYyMWNhLmJpbmRQb3B1cChwb3B1cF9lYjFiNzc0YjVkNjY0NTk5YWIyZWQyNDVmOWFjMTE1MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lM2Q0Y2E0ZjYzMzQ0NzgxYTkyOGFjZmFlN2IyY2ZkMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjQxMTk0Mjk3MzgxMjMyLCAxMjguNjkwNDU3ODQyNzk5NTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2I0YTNlZjcwMzg0NDRhNzY5OTc4NmI0ZjVkZDM2YWMzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTNkNGNhNGY2MzM0NDc4MWE5MjhhY2ZhZTdiMmNmZDAuc2V0SWNvbihpY29uX2I0YTNlZjcwMzg0NDRhNzY5OTc4NmI0ZjVkZDM2YWMzKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81ODljZDBmODg0NzI0ZjNmOWE1YTBiMTBkOGE3YzM4NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMTRkNjhjMTI1YzJlNGU4ZGExMDU0MDI1NzAyZTU3NzUgPSAkKGA8ZGl2IGlkPSJodG1sXzE0ZDY4YzEyNWMyZTRlOGRhMTA1NDAyNTcwMmU1Nzc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7stIjrj5nsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTg5Y2QwZjg4NDcyNGYzZjlhNWEwYjEwZDhhN2MzODcuc2V0Q29udGVudChodG1sXzE0ZDY4YzEyNWMyZTRlOGRhMTA1NDAyNTcwMmU1Nzc1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UzZDRjYTRmNjMzNDQ3ODFhOTI4YWNmYWU3YjJjZmQwLmJpbmRQb3B1cChwb3B1cF81ODljZDBmODg0NzI0ZjNmOWE1YTBiMTBkOGE3YzM4NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yY2IxNTAzNDU5MzQ0OTFjODY2YjZkNzYwOGU1OWYzZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjA0NzI2NDMyNjQzMDk1NSwgMTI3Ljg0NTM3Mzk0ODQxMjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzAzYThmYWE3MzY5ZjQ5ZGI4ZjQ0ODgxMGMwZWM1YWY5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMmNiMTUwMzQ1OTM0NDkxYzg2NmI2ZDc2MDhlNTlmM2Uuc2V0SWNvbihpY29uXzAzYThmYWE3MzY5ZjQ5ZGI4ZjQ0ODgxMGMwZWM1YWY5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hOGVkZDRkMjg0Yzg0MmNhYmQ4ZWFlOWM2YjJhNDU4NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMjk4NTBhOGQ1ZDE2NDZmOGI3ZTg1ZGNhNWM0YTVmNjQgPSAkKGA8ZGl2IGlkPSJodG1sXzI5ODUwYThkNWQxNjQ2ZjhiN2U4NWRjYTVjNGE1ZjY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7slpHrs7TsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYThlZGQ0ZDI4NGM4NDJjYWJkOGVhZTljNmIyYTQ1ODUuc2V0Q29udGVudChodG1sXzI5ODUwYThkNWQxNjQ2ZjhiN2U4NWRjYTVjNGE1ZjY0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzJjYjE1MDM0NTkzNDQ5MWM4NjZiNmQ3NjA4ZTU5ZjNlLmJpbmRQb3B1cChwb3B1cF9hOGVkZDRkMjg0Yzg0MmNhYmQ4ZWFlOWM2YjJhNDU4NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jZGQ4OWQzOTcxM2Y0NzU3YjEyZTU3NGY2NDQ4ZWIxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjYyODM3NTI4MjM2Mjk4LCAxMjcuODEyNDU4NTUzMDU0NjVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzI4NjQwZTY0MGM0YTQ2ZmFhYjU1Y2M5ZTRiNWYwNGM2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfY2RkODlkMzk3MTNmNDc1N2IxMmU1NzRmNjQ0OGViMTUuc2V0SWNvbihpY29uXzI4NjQwZTY0MGM0YTQ2ZmFhYjU1Y2M5ZTRiNWYwNGM2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMWJhZTBhYjhjNmQ0NWVlODlhZTdjZDA4MzUwNTg3MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYTE5NmJiZDAwNzRlNGQ4YThhM2E1Mzk5YjZmODMzZGEgPSAkKGA8ZGl2IGlkPSJodG1sX2ExOTZiYmQwMDc0ZTRkOGE4YTNhNTM5OWI2ZjgzM2RhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7slYjsnZjsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDFiYWUwYWI4YzZkNDVlZTg5YWU3Y2QwODM1MDU4NzEuc2V0Q29udGVudChodG1sX2ExOTZiYmQwMDc0ZTRkOGE4YTNhNTM5OWI2ZjgzM2RhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NkZDg5ZDM5NzEzZjQ3NTdiMTJlNTc0ZjY0NDhlYjE1LmJpbmRQb3B1cChwb3B1cF9kMWJhZTBhYjhjNmQ0NWVlODlhZTdjZDA4MzUwNTg3MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9jOWNhOGQ2MzQwYTk0MDNmYTNkZDY3ZjQwM2I0MmQ0ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjU3NzcwMzkwOTk0ODI1NSwgMTI4LjI4MzAwOTIyNTExNDYzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl82MjllMDQ1NzBiY2E0NDJmOGY1OWY3NGNjNWZiZDNmYSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2M5Y2E4ZDYzNDBhOTQwM2ZhM2RkNjdmNDAzYjQyZDRlLnNldEljb24oaWNvbl82MjllMDQ1NzBiY2E0NDJmOGY1OWY3NGNjNWZiZDNmYSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjg5YTIxZTRjMjQ5NDM2NmE2MTU5OTZjYTJhNDM3ZGQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzIyMDMxNzk1NjNlZTRmODE5OTFiZmEwZDg1ZGNlYjc2ID0gJChgPGRpdiBpZD0iaHRtbF8yMjAzMTc5NTYzZWU0ZjgxOTkxYmZhMGQ4NWRjZWI3NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7IyN7LGF7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I4OWEyMWU0YzI0OTQzNjZhNjE1OTk2Y2EyYTQzN2RkLnNldENvbnRlbnQoaHRtbF8yMjAzMTc5NTYzZWU0ZjgxOTkxYmZhMGQ4NWRjZWI3Nik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jOWNhOGQ2MzQwYTk0MDNmYTNkZDY3ZjQwM2I0MmQ0ZS5iaW5kUG9wdXAocG9wdXBfYjg5YTIxZTRjMjQ5NDM2NmE2MTU5OTZjYTJhNDM3ZGQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2FkYjFmNmE5OTA5NGYwN2E3MzcwZmQwZWNjYzJjMjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yNDYzMzk2MjI5MzA1MzUsIDEyOC42NzExMjcyMDcwMzQ5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNGNlYTljOTBiMGI4NDRhZDllOWJmYTNhNmNlMzM4YWQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8zYWRiMWY2YTk5MDk0ZjA3YTczNzBmZDBlY2NjMmMyMi5zZXRJY29uKGljb25fNGNlYTljOTBiMGI4NDRhZDllOWJmYTNhNmNlMzM4YWQpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzM1NDU0ZGYzMWI0MTRkMWNhYTUyNTg3ZmRmNTBmODYyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9iNGY4ODRjNjE3YjQ0MjM0YTNlZGU1ZWI2ZjYyMWM2ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfYjRmODg0YzYxN2I0NDIzNGEzZWRlNWViNmY2MjFjNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuwmOyngOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zNTQ1NGRmMzFiNDE0ZDFjYWE1MjU4N2ZkZjUwZjg2Mi5zZXRDb250ZW50KGh0bWxfYjRmODg0YzYxN2I0NDIzNGEzZWRlNWViNmY2MjFjNmYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfM2FkYjFmNmE5OTA5NGYwN2E3MzcwZmQwZWNjYzJjMjIuYmluZFBvcHVwKHBvcHVwXzM1NDU0ZGYzMWI0MTRkMWNhYTUyNTg3ZmRmNTBmODYyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MyYzc3NjZmYzMwNTQ0ZWQ4YTg0NTRjZjVmNTVlODYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuNzQwNzEwMTUwODg5MzU2LCAxMjguNjYwNDU0NzQzNjI5OTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzBhYjgwMWNhZWUyZTRiYmM4M2Y2Y2M2NWY1MzRhMWM1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYzJjNzc2NmZjMzA1NDRlZDhhODQ1NGNmNWY1NWU4NjIuc2V0SWNvbihpY29uXzBhYjgwMWNhZWUyZTRiYmM4M2Y2Y2M2NWY1MzRhMWM1KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mZmIyMTM4OGQ2ZmY0OWZjODVhMDg2NGYzNjY2YTViNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzU1MWM5NzA2YTJhNDVjNGIwMGYzZWE3Yzg0YzlmMjUgPSAkKGA8ZGl2IGlkPSJodG1sXzM1NTFjOTcwNmEyYTQ1YzRiMDBmM2VhN2M4NGM5ZjI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7tlbTquIjqsJXsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZmZiMjEzODhkNmZmNDlmYzg1YTA4NjRmMzY2NmE1YjQuc2V0Q29udGVudChodG1sXzM1NTFjOTcwNmEyYTQ1YzRiMDBmM2VhN2M4NGM5ZjI1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2MyYzc3NjZmYzMwNTQ0ZWQ4YTg0NTRjZjVmNTVlODYyLmJpbmRQb3B1cChwb3B1cF9mZmIyMTM4OGQ2ZmY0OWZjODVhMDg2NGYzNjY2YTViNCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NmE2NTM1ZmRiNDA0MjgzYjk5NzY3YTQ4NThiOWMwNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0Ljc3MzM2NDkxNTQ2NDQ5LCAxMjguNjQwMjk0NDgzNzAyMzhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzZhNGMyZGNlZTY0OTQ5MDViYTVlZGEwZWE5ZmU5ZmIzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNjZhNjUzNWZkYjQwNDI4M2I5OTc2N2E0ODU4YjljMDUuc2V0SWNvbihpY29uXzZhNGMyZGNlZTY0OTQ5MDViYTVlZGEwZWE5ZmU5ZmIzKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lZGJmZDU5Nzk2MWI0MjkyYmEwYzY4MWJhNjNhOTJiMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWRkMjk2ZDVkYjNlNDljNmI1YWJmYzVmNDIxMjU0YzQgPSAkKGA8ZGl2IGlkPSJodG1sXzlkZDI5NmQ1ZGIzZTQ5YzZiNWFiZmM1ZjQyMTI1NGM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7tlZnrj5nsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWRiZmQ1OTc5NjFiNDI5MmJhMGM2ODFiYTYzYTkyYjIuc2V0Q29udGVudChodG1sXzlkZDI5NmQ1ZGIzZTQ5YzZiNWFiZmM1ZjQyMTI1NGM0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY2YTY1MzVmZGI0MDQyODNiOTk3NjdhNDg1OGI5YzA1LmJpbmRQb3B1cChwb3B1cF9lZGJmZDU5Nzk2MWI0MjkyYmEwYzY4MWJhNjNhOTJiMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80YmI5MTUxYWQ1NmE0ZDQ3ODgzODI4NzMwYjIzMDhkMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIzMzU0NzkwMjczODA0LCAxMjguMjY5NTA3OTY0MDc3NzVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzM2YjMzNmE1OTM4YzRkZmFhZTVmNjg0NDEzYWJlMDAzID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNGJiOTE1MWFkNTZhNGQ0Nzg4MzgyODczMGIyMzA4ZDMuc2V0SWNvbihpY29uXzM2YjMzNmE1OTM4YzRkZmFhZTVmNjg0NDEzYWJlMDAzKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83NWQ1YjcwZTZiM2I0ZWQ3OTA1ZTNhNTJmOTZhNjVhZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzA2MWM3YzYxNGY4NDNlNmEyNzVhNWU3MjRiYjgwZGIgPSAkKGA8ZGl2IGlkPSJodG1sXzcwNjFjN2M2MTRmODQzZTZhMjc1YTVlNzI0YmI4MGRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sp4DsiJjsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzVkNWI3MGU2YjNiNGVkNzkwNWUzYTUyZjk2YTY1YWQuc2V0Q29udGVudChodG1sXzcwNjFjN2M2MTRmODQzZTZhMjc1YTVlNzI0YmI4MGRiKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzRiYjkxNTFhZDU2YTRkNDc4ODM4Mjg3MzBiMjMwOGQzLmJpbmRQb3B1cChwb3B1cF83NWQ1YjcwZTZiM2I0ZWQ3OTA1ZTNhNTJmOTZhNjVhZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZDU4Yjg0ZDU1YzE0ZjBkOGY5YjhiZWFlZjJmOTFmMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI5ODYyODg0MDY1Njc1LCAxMjguNjAzOTkyOTY0ODA1MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMDg4NTM1ZmIyYjY3NDZhYWFlZjYzM2FjYmJmMTA2MmIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl81ZDU4Yjg0ZDU1YzE0ZjBkOGY5YjhiZWFlZjJmOTFmMC5zZXRJY29uKGljb25fMDg4NTM1ZmIyYjY3NDZhYWFlZjYzM2FjYmJmMTA2MmIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzExNWFmY2Y1NWY3YTRhMjFhMTEwOTkzNzI3MTVhOTlhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xMWM3ZDJiNTBlYjI0NjY2YTlmNmRkY2RiNjYyMDQ2NiA9ICQoYDxkaXYgaWQ9Imh0bWxfMTFjN2QyYjUwZWIyNDY2NmE5ZjZkZGNkYjY2MjA0NjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuqwkOqzhO2ZlOyynOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xMTVhZmNmNTVmN2E0YTIxYTExMDk5MzcyNzE1YTk5YS5zZXRDb250ZW50KGh0bWxfMTFjN2QyYjUwZWIyNDY2NmE5ZjZkZGNkYjY2MjA0NjYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNWQ1OGI4NGQ1NWMxNGYwZDhmOWI4YmVhZWYyZjkxZjAuYmluZFBvcHVwKHBvcHVwXzExNWFmY2Y1NWY3YTRhMjFhMTEwOTkzNzI3MTVhOTlhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI3Y2YyYzUyYjljYzQ2MmY4MGM4MDYwMGI0Y2Q3MDRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjA3MDU5NDg0MjM5ODIsIDEyOC41NzgyOTU4ODM1MzM3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9mM2Q1Mzk1MjkyMjM0ZmVhYjRhNDdlOWU1NDEwOWY2NiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzI3Y2YyYzUyYjljYzQ2MmY4MGM4MDYwMGI0Y2Q3MDRhLnNldEljb24oaWNvbl9mM2Q1Mzk1MjkyMjM0ZmVhYjRhNDdlOWU1NDEwOWY2Nik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzE3NzYwMzRkMWEzNDUyYmJhZGVmYjczZGEwZjJmNTYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzM1MTJhNGYzM2Y5NzQ2OGZhNTk2ZWU5YTk2YmViNGE4ID0gJChgPGRpdiBpZD0iaHRtbF8zNTEyYTRmMzNmOTc0NjhmYTU5NmVlOWE5NmJlYjRhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+66eI7IKw7KeB7JiB7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2MxNzc2MDM0ZDFhMzQ1MmJiYWRlZmI3M2RhMGYyZjU2LnNldENvbnRlbnQoaHRtbF8zNTEyYTRmMzNmOTc0NjhmYTU5NmVlOWE5NmJlYjRhOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yN2NmMmM1MmI5Y2M0NjJmODBjODA2MDBiNGNkNzA0YS5iaW5kUG9wdXAocG9wdXBfYzE3NzYwMzRkMWEzNDUyYmJhZGVmYjczZGEwZjJmNTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2M4ZjRiYWE3OTQwNGIwY2I2YTM3ZGY1N2E1MjBjMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS42Mjc4MDcyNTA1OTAyNiwgMTI4LjA0MjYwNzk4NDQwMzYyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9mNjJmNGE5OGI3NzM0NmUxOTg4YzQ3OTI2NzAwNjMzYSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzNjOGY0YmFhNzk0MDRiMGNiNmEzN2RmNTdhNTIwYzM5LnNldEljb24oaWNvbl9mNjJmNGE5OGI3NzM0NmUxOTg4YzQ3OTI2NzAwNjMzYSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmE5MTFhMDlhNzk4NGNlMWEyZTc4M2NkMjAxMmQ5ZmMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzkwYmUxMzA4M2FiYzQ1ODJiYmY2NDYyNGE0NWNlZjVkID0gJChgPGRpdiBpZD0iaHRtbF85MGJlMTMwODNhYmM0NTgyYmJmNjQ2MjRhNDVjZWY1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+67SJ7IKw7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJhOTExYTA5YTc5ODRjZTFhMmU3ODNjZDIwMTJkOWZjLnNldENvbnRlbnQoaHRtbF85MGJlMTMwODNhYmM0NTgyYmJmNjQ2MjRhNDVjZWY1ZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zYzhmNGJhYTc5NDA0YjBjYjZhMzdkZjU3YTUyMGMzOS5iaW5kUG9wdXAocG9wdXBfMmE5MTFhMDlhNzk4NGNlMWEyZTc4M2NkMjAxMmQ5ZmMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTUwMzBmODA5MDdlNDI0MDg5ZThkMDAyZTExY2U2MDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS41MjE2NjMyNjMzMTg3MiwgMTI3Ljc4NzE4OTcyNzY3NDIzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8wNzRlZTk2NWYwYjk0NTM4ODdlNWU1YzdiMmIyZDEyNiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2E1MDMwZjgwOTA3ZTQyNDA4OWU4ZDAwMmUxMWNlNjA4LnNldEljb24oaWNvbl8wNzRlZTk2NWYwYjk0NTM4ODdlNWU1YzdiMmIyZDEyNik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNTE4MzVkMjU5YzUyNDczYjljNTYyZGE1M2ZhYTM0MDkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2YyMTI1MDBkZDNmZjQyN2E5ODBhMGVmODVjZWZkNTBhID0gJChgPGRpdiBpZD0iaHRtbF9mMjEyNTAwZGQzZmY0MjdhOTgwYTBlZjg1Y2VmZDUwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7IiY64+Z7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzUxODM1ZDI1OWM1MjQ3M2I5YzU2MmRhNTNmYWEzNDA5LnNldENvbnRlbnQoaHRtbF9mMjEyNTAwZGQzZmY0MjdhOTgwYTBlZjg1Y2VmZDUwYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNTAzMGY4MDkwN2U0MjQwODllOGQwMDJlMTFjZTYwOC5iaW5kUG9wdXAocG9wdXBfNTE4MzVkMjU5YzUyNDczYjljNTYyZGE1M2ZhYTM0MDkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTM4NGEzNzFhNWI0NDhjZGJhZTY1ODk0MDI3NDNiZGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS43MDgxODY2MDk5MTM2NzUsIDEyOC4wMTU2MzE0NzUyNDMxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9jOTI5YmE1YWZjYzE0Mjk3ODQyN2EyMmIxMTFkNjdkMCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzUzODRhMzcxYTViNDQ4Y2RiYWU2NTg5NDAyNzQzYmRiLnNldEljb24oaWNvbl9jOTI5YmE1YWZjYzE0Mjk3ODQyN2EyMmIxMTFkNjdkMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjMzYTFiMWQ4NThjNDEyMTg2YTRkNjk0NDY0NGZjZTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQ5NzMyYjkyZTcxZjRjZTliNzQwN2VkZjg0OTFkNDQ3ID0gJChgPGRpdiBpZD0iaHRtbF80OTczMmI5MmU3MWY0Y2U5Yjc0MDdlZGY4NDkxZDQ0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6rCA7KGw7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YzM2ExYjFkODU4YzQxMjE4NmE0ZDY5NDQ2NDRmY2U0LnNldENvbnRlbnQoaHRtbF80OTczMmI5MmU3MWY0Y2U5Yjc0MDdlZGY4NDkxZDQ0Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81Mzg0YTM3MWE1YjQ0OGNkYmFlNjU4OTQwMjc0M2JkYi5iaW5kUG9wdXAocG9wdXBfZjMzYTFiMWQ4NThjNDEyMTg2YTRkNjk0NDY0NGZjZTQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjU3MzY5NTA2N2E5NGI4MDkyNTZlZTM3YmMyNTNhZDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS42ODg5NzE2MjczODU0NSwgMTI3LjkyMzk4NzYxMzI3NDczXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl83ZGQwZDNlZjQ4YWI0YjJjOTI2MTA0N2I5MmZiZGVhZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2Y1NzM2OTUwNjdhOTRiODA5MjU2ZWUzN2JjMjUzYWQyLnNldEljb24oaWNvbl83ZGQwZDNlZjQ4YWI0YjJjOTI2MTA0N2I5MmZiZGVhZCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOGU0OWI1NGUxNGY1NDgwY2I4MTY1MjUyYWYyMDZlZjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Y0N2U5OTJkM2ZjMDRjOTNhYTAyMTBhYmU0NTk0NDk1ID0gJChgPGRpdiBpZD0iaHRtbF9mNDdlOTkyZDNmYzA0YzkzYWEwMjEwYWJlNDU5NDQ5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7KO86rO17KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzhlNDliNTRlMTRmNTQ4MGNiODE2NTI1MmFmMjA2ZWY1LnNldENvbnRlbnQoaHRtbF9mNDdlOTkyZDNmYzA0YzkzYWEwMjEwYWJlNDU5NDQ5NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mNTczNjk1MDY3YTk0YjgwOTI1NmVlMzdiYzI1M2FkMi5iaW5kUG9wdXAocG9wdXBfOGU0OWI1NGUxNGY1NDgwY2I4MTY1MjUyYWYyMDZlZjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWU4NGFjNzlmMWMzNDc0YzgzMmRjZDBmZDQyODQ4OTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNC45NjQ3NzE4NzIyODI3OTYsIDEyNy43OTAzODM4Nzk5OTczNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZWI0YTkyNGQ2NDRiNDc5YzhiNTA0MTg5MTI2OTI2NmMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl81ZTg0YWM3OWYxYzM0NzRjODMyZGNkMGZkNDI4NDg5OS5zZXRJY29uKGljb25fZWI0YTkyNGQ2NDRiNDc5YzhiNTA0MTg5MTI2OTI2NmMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzYzZTc3OGRmMTgyNzQ0ZTJiODRhZmQyN2I2NjNlYzFmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85YTZlZjkxZDY4MDY0OWMxOGJiN2MwZDVmNTJiNDk0NiA9ICQoYDxkaXYgaWQ9Imh0bWxfOWE2ZWY5MWQ2ODA2NDljMThiYjdjMGQ1ZjUyYjQ5NDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuq4iOyEseygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF82M2U3NzhkZjE4Mjc0NGUyYjg0YWZkMjdiNjYzZWMxZi5zZXRDb250ZW50KGh0bWxfOWE2ZWY5MWQ2ODA2NDljMThiYjdjMGQ1ZjUyYjQ5NDYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNWU4NGFjNzlmMWMzNDc0YzgzMmRjZDBmZDQyODQ4OTkuYmluZFBvcHVwKHBvcHVwXzYzZTc3OGRmMTgyNzQ0ZTJiODRhZmQyN2I2NjNlYzFmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2RiNjg4NDgzNWUxMTQxYmE5MzY3ZjhiMDQ0YTM2Mzg2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMDI1MzQwMjc0NTMwNDg1LCAxMjcuOTAzODY1OTQ3NjIyOV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fODRkM2RjMzU3M2E4NGNlODgxZDk4N2EwMmMwMjU2NmUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9kYjY4ODQ4MzVlMTE0MWJhOTM2N2Y4YjA0NGEzNjM4Ni5zZXRJY29uKGljb25fODRkM2RjMzU3M2E4NGNlODgxZDk4N2EwMmMwMjU2NmUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkzYjU0NTM3MjllMTRiYzk5N2RiZjIwOWI5M2FjNGU1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zNjBiZGRmNWY1ZGI0OWI4OThmYzNkN2IwNzhiYTMzNSA9ICQoYDxkaXYgaWQ9Imh0bWxfMzYwYmRkZjVmNWRiNDliODk4ZmMzZDdiMDc4YmEzMzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuynhOq1kOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85M2I1NDUzNzI5ZTE0YmM5OTdkYmYyMDliOTNhYzRlNS5zZXRDb250ZW50KGh0bWxfMzYwYmRkZjVmNWRiNDliODk4ZmMzZDdiMDc4YmEzMzUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZGI2ODg0ODM1ZTExNDFiYTkzNjdmOGIwNDRhMzYzODYuYmluZFBvcHVwKHBvcHVwXzkzYjU0NTM3MjllMTRiYzk5N2RiZjIwOWI5M2FjNGU1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2FmNmMzYTY3ZDhjODRiZjY5MTEwOTFmZDJlOWZjY2FiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMTA5NDc2NTM4MjkwNTQsIDEyNy44MTAyNTg0Mzk4MzI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl81ZDRiY2E4NmQyNzA0NzdmYThkMzhiNGJkNWZhMTc4NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2FmNmMzYTY3ZDhjODRiZjY5MTEwOTFmZDJlOWZjY2FiLnNldEljb24oaWNvbl81ZDRiY2E4NmQyNzA0NzdmYThkMzhiNGJkNWZhMTc4NCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTY5ZDFkMzAxMGVhNDljNGJkYjkwMTljZTM0NzkxYmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2IzNjc2MTUwNzg3ZTQ4MWQ4YTI5MjA1OGIyNmVjNzUyID0gJChgPGRpdiBpZD0iaHRtbF9iMzY3NjE1MDc4N2U0ODFkOGEyOTIwNThiMjZlYzc1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Zqh7LKc7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U2OWQxZDMwMTBlYTQ5YzRiZGI5MDE5Y2UzNDc5MWJmLnNldENvbnRlbnQoaHRtbF9iMzY3NjE1MDc4N2U0ODFkOGEyOTIwNThiMjZlYzc1Mik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hZjZjM2E2N2Q4Yzg0YmY2OTExMDkxZmQyZTlmY2NhYi5iaW5kUG9wdXAocG9wdXBfZTY5ZDFkMzAxMGVhNDljNGJkYjkwMTljZTM0NzkxYmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGE0NGU2OGNhNWNjNDIwMGI1MmQ5NjNjOWE3NzA3NGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4wNjg2ODA1OTc1OTcxLCAxMjcuNzQ3NTg4NzYxMzY4NjhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzQ3ZDM2M2Y1ZjVjMTQ3NjE5OTE2MjU5ZmUyNDJmYTgyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZGE0NGU2OGNhNWNjNDIwMGI1MmQ5NjNjOWE3NzA3NGIuc2V0SWNvbihpY29uXzQ3ZDM2M2Y1ZjVjMTQ3NjE5OTE2MjU5ZmUyNDJmYTgyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83NDQ0NGYxZjAwMzc0NWNhOTNkNzM3ZjBlOTc1ZTQ4ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjRkNzIxNTBiMTYxNGFkNThiMzgwZTZkZmVmMWZkMTkgPSAkKGA8ZGl2IGlkPSJodG1sX2I0ZDcyMTUwYjE2MTRhZDU4YjM4MGU2ZGZlZjFmZDE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7tlZjrj5nsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzQ0NDRmMWYwMDM3NDVjYTkzZDczN2YwZTk3NWU0OGYuc2V0Q29udGVudChodG1sX2I0ZDcyMTUwYjE2MTRhZDU4YjM4MGU2ZGZlZjFmZDE5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2RhNDRlNjhjYTVjYzQyMDBiNTJkOTYzYzlhNzcwNzRiLmJpbmRQb3B1cChwb3B1cF83NDQ0NGYxZjAwMzc0NWNhOTNkNzM3ZjBlOTc1ZTQ4ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZDAwOWM4NGI3NDY0OWUyYTQ1YWE0ODNmZGQ1M2M5ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjMwMjkxMTg4OTA0NDA3LCAxMjcuOTcyNTM1NTk1NTM2MjddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2UyMmQ0NTA2MDU0ZjQwZjg5ZDIwYjRjOTIxYmI3ZjljID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMGQwMDljODRiNzQ2NDllMmE0NWFhNDgzZmRkNTNjOWQuc2V0SWNvbihpY29uX2UyMmQ0NTA2MDU0ZjQwZjg5ZDIwYjRjOTIxYmI3ZjljKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81NTc2YzA0NzczZGE0NWJiYTM5ZjBhOTA4ODYzMTcyZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMDQyM2FlOWM4YjRiNDU5ZmE2YTExOTQ1OWM3ZWU0NjcgPSAkKGA8ZGl2IGlkPSJodG1sXzA0MjNhZTljOGI0YjQ1OWZhNmExMTk0NTljN2VlNDY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sm5Dsp4DsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTU3NmMwNDc3M2RhNDViYmEzOWYwYTkwODg2MzE3MmUuc2V0Q29udGVudChodG1sXzA0MjNhZTljOGI0YjQ1OWZhNmExMTk0NTljN2VlNDY3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzBkMDA5Yzg0Yjc0NjQ5ZTJhNDVhYTQ4M2ZkZDUzYzlkLmJpbmRQb3B1cChwb3B1cF81NTc2YzA0NzczZGE0NWJiYTM5ZjBhOTA4ODYzMTcyZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZWY5MGE4Njk2ODA0NGZiOTAyNTg4MmFkNDRiYmU1NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjM3ODMwNTc3NjE5Nzk4LCAxMjguMDA5NTQ4MDIxMDIyNF0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYmM3Y2M2MDI3MzVlNGE5NTkxZGFiZmMwNTcyZDU0NGMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9lZWY5MGE4Njk2ODA0NGZiOTAyNTg4MmFkNDRiYmU1NS5zZXRJY29uKGljb25fYmM3Y2M2MDI3MzVlNGE5NTkxZGFiZmMwNTcyZDU0NGMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2E1YjA0MGVkOWYyODQ5ZmVhYzc2NjdjYTljNGJjMGNmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81NDFmZWFhZjFlZjQ0NDI0ODc5ZDdiZTdmM2U1NzM2ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfNTQxZmVhYWYxZWY0NDQyNDg3OWQ3YmU3ZjNlNTczNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuLqOqzhOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNWIwNDBlZDlmMjg0OWZlYWM3NjY3Y2E5YzRiYzBjZi5zZXRDb250ZW50KGh0bWxfNTQxZmVhYWYxZWY0NDQyNDg3OWQ3YmU3ZjNlNTczNmUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZWVmOTBhODY5NjgwNDRmYjkwMjU4ODJhZDQ0YmJlNTUuYmluZFBvcHVwKHBvcHVwX2E1YjA0MGVkOWYyODQ5ZmVhYzc2NjdjYTljNGJjMGNmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzQxMzFhOWUyZDc3YjQxYjI5YjMzMDc4YmMxZmI4MTgyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNDE0MTc5NjIzOTY2MjM0LCAxMjcuODc2MTc1OTA1MjExMTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzI4ODRmMDk1YWQ0ZTQwMGZiZWQxMzI1ZWJmYzkxMWNlID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNDEzMWE5ZTJkNzdiNDFiMjliMzMwNzhiYzFmYjgxODIuc2V0SWNvbihpY29uXzI4ODRmMDk1YWQ0ZTQwMGZiZWQxMzI1ZWJmYzkxMWNlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81Mzk0ZTU5NzA2ODQ0YTE2YTkwMTU4ZDVkNTBhYzQxYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzUzODJjNmY2OGUyNDVlOWE1Mjk4MWQ4ZWQ5OGE1Y2MgPSAkKGA8ZGl2IGlkPSJodG1sX2M1MzgyYzZmNjhlMjQ1ZTlhNTI5ODFkOGVkOThhNWNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sgrDssq3soJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTM5NGU1OTcwNjg0NGExNmE5MDE1OGQ1ZDUwYWM0MWEuc2V0Q29udGVudChodG1sX2M1MzgyYzZmNjhlMjQ1ZTlhNTI5ODFkOGVkOThhNWNjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzQxMzFhOWUyZDc3YjQxYjI5YjMzMDc4YmMxZmI4MTgyLmJpbmRQb3B1cChwb3B1cF81Mzk0ZTU5NzA2ODQ0YTE2YTkwMTU4ZDVkNTBhYzQxYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84OTQzNzYzMjA4NjE0MTJkYjAxOGNmODdhNTg1Y2E0NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjA1MzI5MDE1NDA2Mjk4LCAxMjguMDc2MDE4MzQ0MTMxMTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzE4YzBkZjEwY2U0OTQ3OWI4NDUzMGFiOWZkZjdkYjIxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfODk0Mzc2MzIwODYxNDEyZGIwMThjZjg3YTU4NWNhNDcuc2V0SWNvbihpY29uXzE4YzBkZjEwY2U0OTQ3OWI4NDUzMGFiOWZkZjdkYjIxKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wNmVhMDdkMTA4NzI0M2IyYmUxNjA2NzdhMDhjOGUwMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzk5Mjc3NzA3ZWRmNGY0YWIwMTlhMmE4ZDA5NGM4M2QgPSAkKGA8ZGl2IGlkPSJodG1sXzM5OTI3NzcwN2VkZjRmNGFiMDE5YTJhOGQwOTRjODNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sgqzrgqjsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDZlYTA3ZDEwODcyNDNiMmJlMTYwNjc3YTA4YzhlMDMuc2V0Q29udGVudChodG1sXzM5OTI3NzcwN2VkZjRmNGFiMDE5YTJhOGQwOTRjODNkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg5NDM3NjMyMDg2MTQxMmRiMDE4Y2Y4N2E1ODVjYTQ3LmJpbmRQb3B1cChwb3B1cF8wNmVhMDdkMTA4NzI0M2IyYmUxNjA2NzdhMDhjOGUwMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNDgwYTI4YzdhNTE0OTMwODNkNjJhM2Q5MTBlOWZkMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0LjkzODc3Mjk2OTY3NzE4LCAxMjguMDg3NTIzNTY4NTE0MjZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2FiN2EyMzY5ZWUxMjQ3MDM5Yzg2ZTcyYTcxODYxMzY0ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTQ4MGEyOGM3YTUxNDkzMDgzZDYyYTNkOTEwZTlmZDIuc2V0SWNvbihpY29uX2FiN2EyMzY5ZWUxMjQ3MDM5Yzg2ZTcyYTcxODYxMzY0KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80OGRjNTMxOGNlZWY0ZjcyYTczNDA5OGFhOTQyZDljNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODBjMTA3YmIxNGQ0NDBlNWI0NDdmMzgzZDhhZWU3NTAgPSAkKGA8ZGl2IGlkPSJodG1sXzgwYzEwN2JiMTRkNDQwZTViNDQ3ZjM4M2Q4YWVlNzUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rsozrpqzsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDhkYzUzMThjZWVmNGY3MmE3MzQwOThhYTk0MmQ5YzUuc2V0Q29udGVudChodG1sXzgwYzEwN2JiMTRkNDQwZTViNDQ3ZjM4M2Q4YWVlNzUwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2U0ODBhMjhjN2E1MTQ5MzA4M2Q2MmEzZDkxMGU5ZmQyLmJpbmRQb3B1cChwb3B1cF80OGRjNTMxOGNlZWY0ZjcyYTczNDA5OGFhOTQyZDljNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMDczOTNjOWEyMjY0MGY4ODEwZmY5MmRjYjY3ZTkzYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0Ljk3MDIzNjA3NjgxOTk0NCwgMTI4LjA2Mjc1OTM2MzE0NTFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzUyN2NmMzRlNjRiNTQ2MzA4OTc2M2E4MDM2NTM4NjE0ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTA3MzkzYzlhMjI2NDBmODgxMGZmOTJkY2I2N2U5M2Euc2V0SWNvbihpY29uXzUyN2NmMzRlNjRiNTQ2MzA4OTc2M2E4MDM2NTM4NjE0KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jYTY2MzE0OTBlNzk0Mjk4OTQ0ZTIwMzU4YzA4NmM3ZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODRhNGUyMDdkMGJiNDZkZmIzMzRkNTE5MzZlNjdhNmQgPSAkKGA8ZGl2IGlkPSJodG1sXzg0YTRlMjA3ZDBiYjQ2ZGZiMzM0ZDUxOTM2ZTY3YTZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sgqzsspzrgqjslpHsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2E2NjMxNDkwZTc5NDI5ODk0NGUyMDM1OGMwODZjN2Uuc2V0Q29udGVudChodG1sXzg0YTRlMjA3ZDBiYjQ2ZGZiMzM0ZDUxOTM2ZTY3YTZkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UwNzM5M2M5YTIyNjQwZjg4MTBmZjkyZGNiNjdlOTNhLmJpbmRQb3B1cChwb3B1cF9jYTY2MzE0OTBlNzk0Mjk4OTQ0ZTIwMzU4YzA4NmM3ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZGI5ZmQzMDExOTc0ODJmYjVmODJkYzc2Y2YzYWY0MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjE4NDgyMjkyMzgxMjIwNiwgMTI4LjA4OTAzOTYzOTYxODM2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9iZTMxMTYzOGQ3MjI0ZjcyYTE0NDIyZWE1OTRkZTU4MSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzdkYjlmZDMwMTE5NzQ4MmZiNWY4MmRjNzZjZjNhZjQwLnNldEljb24oaWNvbl9iZTMxMTYzOGQ3MjI0ZjcyYTE0NDIyZWE1OTRkZTU4MSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjg5ZDhkNTZlNjcyNDYwMGE4ZjljMjIxMmJiY2E3MjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzUyZjE5MGEwMTg4NTRkNTg4NTIzODc4MDg4YTA0OWEzID0gJChgPGRpdiBpZD0iaHRtbF81MmYxOTBhMDE4ODU0ZDU4ODUyMzg3ODA4OGEwNDlhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Lmg7JWU7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI4OWQ4ZDU2ZTY3MjQ2MDBhOGY5YzIyMTJiYmNhNzI3LnNldENvbnRlbnQoaHRtbF81MmYxOTBhMDE4ODU0ZDU4ODUyMzg3ODA4OGEwNDlhMyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl83ZGI5ZmQzMDExOTc0ODJmYjVmODJkYzc2Y2YzYWY0MC5iaW5kUG9wdXAocG9wdXBfMjg5ZDhkNTZlNjcyNDYwMGE4ZjljMjIxMmJiY2E3MjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTljMWRmZjdkYmE3NDU0NTg5ODViOWI2ZTg3OTM5MzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMTQyOTU4NjM5NzQ3LCAxMjguMTQ2Mzg3NTA0MzAxM10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYWFkNTY5NGFhMTE0NDAzZmE2YTgyZWRlNTU1YWJkMDIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9lOWMxZGZmN2RiYTc0NTQ1ODk4NWI5YjZlODc5MzkzMC5zZXRJY29uKGljb25fYWFkNTY5NGFhMTE0NDAzZmE2YTgyZWRlNTU1YWJkMDIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRiMjRlODYyMDhlOTQwOTJhZDdmNjQ4NzdlOGFkOGUxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMjljMjY0ZDI3YWU0NjAzODI2YjljMmM1NWMwNjlmYyA9ICQoYDxkaXYgaWQ9Imh0bWxfMjI5YzI2NGQyN2FlNDYwMzgyNmI5YzJjNTVjMDY5ZmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuq4iOyCsOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80YjI0ZTg2MjA4ZTk0MDkyYWQ3ZjY0ODc3ZThhZDhlMS5zZXRDb250ZW50KGh0bWxfMjI5YzI2NGQyN2FlNDYwMzgyNmI5YzJjNTVjMDY5ZmMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfZTljMWRmZjdkYmE3NDU0NTg5ODViOWI2ZTg3OTM5MzAuYmluZFBvcHVwKHBvcHVwXzRiMjRlODYyMDhlOTQwOTJhZDdmNjQ4NzdlOGFkOGUxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzA4YzA5YjJkMTg3MjRkYjBiYzM5ZTFkNWRlOGM1MWQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjYzMjY5MDgwNTk2MzgsIDEyOC4xNjkyNzQ0NjE5Njc1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kNDFkNjJkM2YzZjU0Mzk2YTE3ZTI2ODFiNDE3NDRjZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzA4YzA5YjJkMTg3MjRkYjBiYzM5ZTFkNWRlOGM1MWQzLnNldEljb24oaWNvbl9kNDFkNjJkM2YzZjU0Mzk2YTE3ZTI2ODFiNDE3NDRjZCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWZkZDM3NmJkYzcxNDVmYjg1ZTUxNTNhNTJhZWQ4MzggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzBmZGY3NmNhNjE3MzQyYzNiZmY3ZjQ5YjJhMTVhZjE4ID0gJChgPGRpdiBpZD0iaHRtbF8wZmRmNzZjYTYxNzM0MmMzYmZmN2Y0OWIyYTE1YWYxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64yA6rOh7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VmZGQzNzZiZGM3MTQ1ZmI4NWU1MTUzYTUyYWVkODM4LnNldENvbnRlbnQoaHRtbF8wZmRmNzZjYTYxNzM0MmMzYmZmN2Y0OWIyYTE1YWYxOCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8wOGMwOWIyZDE4NzI0ZGIwYmMzOWUxZDVkZThjNTFkMy5iaW5kUG9wdXAocG9wdXBfZWZkZDM3NmJkYzcxNDVmYjg1ZTUxNTNhNTJhZWQ4MzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTY2ZTdjYzY5MjIwNGE2ZTg3OGZiYTJmM2FiNTMxOGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xNjk5MTU1NTk2MTM2MSwgMTI4LjI4MTAwNDQ1NDgwNjMyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8zNDZkYjkyMGU2ZmU0YTQzYjI5YjQ5YjQ3MTYxYTU4NiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2E2NmU3Y2M2OTIyMDRhNmU4NzhmYmEyZjNhYjUzMThkLnNldEljb24oaWNvbl8zNDZkYjkyMGU2ZmU0YTQzYjI5YjQ5YjQ3MTYxYTU4Nik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjIyNjU5NWRkY2NmNDQzNmFkYTdiMmNhMmRiNGJlZmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzk0NWJmZGEzZjVhMDRhNDQ5NzJiMjI5OGY1NjAxYWJmID0gJChgPGRpdiBpZD0iaHRtbF85NDViZmRhM2Y1YTA0YTQ0OTcyYjIyOThmNTYwMWFiZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+67CY7ISx7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzIyMjY1OTVkZGNjZjQ0MzZhZGE3YjJjYTJkYjRiZWZmLnNldENvbnRlbnQoaHRtbF85NDViZmRhM2Y1YTA0YTQ0OTcyYjIyOThmNTYwMWFiZik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNjZlN2NjNjkyMjA0YTZlODc4ZmJhMmYzYWI1MzE4ZC5iaW5kUG9wdXAocG9wdXBfMjIyNjU5NWRkY2NmNDQzNmFkYTdiMmNhMmRiNGJlZmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGRkYWI4ZmRjMTBhNGU3YzgxYzZkZjdmMGNhZGJhMmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4wOTEwODk2NTUxNjYyMzYsIDEyOC4xODU5NzA0NzUzNzkxXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8wZmNlY2FlNjdjY2I0ZWY2OTJkZmYyYzcyMDIxZGEzOSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2RkZGFiOGZkYzEwYTRlN2M4MWM2ZGY3ZjBjYWRiYTJlLnNldEljb24oaWNvbl8wZmNlY2FlNjdjY2I0ZWY2OTJkZmYyYzcyMDIxZGEzOSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2RlYWI4YTEzYjU5NDg2NzhkZTIzZDI5YWMyN2NhZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzc2NTkxNzNiNDczNTQzYjliZjQwZDQ3YTQ3ZGUxNDA0ID0gJChgPGRpdiBpZD0iaHRtbF83NjU5MTczYjQ3MzU0M2I5YmY0MGQ0N2E0N2RlMTQwNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6riI6rOh7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzNkZWFiOGExM2I1OTQ4Njc4ZGUyM2QyOWFjMjdjYWY4LnNldENvbnRlbnQoaHRtbF83NjU5MTczYjQ3MzU0M2I5YmY0MGQ0N2E0N2RlMTQwNCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9kZGRhYjhmZGMxMGE0ZTdjODFjNmRmN2YwY2FkYmEyZS5iaW5kUG9wdXAocG9wdXBfM2RlYWI4YTEzYjU5NDg2NzhkZTIzZDI5YWMyN2NhZjgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDQzYTVjYzdiYTVhNDljNDliNTU0OWM5NmVlYmRkOWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xOTgyNDQxNjk2ODc0LCAxMjguMDcxMzYwNTUyOTgzOTJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzMxM2M4MjM3NzBiYzQ0MDY4MDg0YjU5ZDg0MDM0NTgwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMDQzYTVjYzdiYTVhNDljNDliNTU0OWM5NmVlYmRkOWEuc2V0SWNvbihpY29uXzMxM2M4MjM3NzBiYzQ0MDY4MDg0YjU5ZDg0MDM0NTgwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NWY4NTA5NWE5YjE0YTU4OTExNTg0MmJmYWZjZDgwNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTU0YjgyZTdlYTlmNDAwMWEzMzA3ODgxOTk5NzNlNmUgPSAkKGA8ZGl2IGlkPSJodG1sX2U1NGI4MmU3ZWE5ZjQwMDFhMzMwNzg4MTk5OTczZTZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sg4HrtInsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDVmODUwOTVhOWIxNGE1ODkxMTU4NDJiZmFmY2Q4MDUuc2V0Q29udGVudChodG1sX2U1NGI4MmU3ZWE5ZjQwMDFhMzMwNzg4MTk5OTczZTZlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzA0M2E1Y2M3YmE1YTQ5YzQ5YjU1NDljOTZlZWJkZDlhLmJpbmRQb3B1cChwb3B1cF80NWY4NTA5NWE5YjE0YTU4OTExNTg0MmJmYWZjZDgwNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lZjY0OGMyYTRlNzM0YjczYWE1OGNjZTQ2ZDE0OWExYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIxNTY2MTIxMzAxMDI0LCAxMjguMTAxODQ4NDkzNjczODNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2QxNjAxZGQ3NDljYTRmZjA4YjllMGEyMjIzYTg1NTQ1ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZWY2NDhjMmE0ZTczNGI3M2FhNThjY2U0NmQxNDlhMWMuc2V0SWNvbihpY29uX2QxNjAxZGQ3NDljYTRmZjA4YjllMGEyMjIzYTg1NTQ1KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yZWY5MDA3MGRkYjg0MDMyOWFmMzQ3MmU5MDRjZjJhMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYmVkZjZhY2YwNjM0NDM1NzhjOWNhYzA2ZjAyNmQ1NmUgPSAkKGA8ZGl2IGlkPSJodG1sX2JlZGY2YWNmMDYzNDQzNTc4YzljYWMwNmYwMjZkNTZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7stIjsnqXsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmVmOTAwNzBkZGI4NDAzMjlhZjM0NzJlOTA0Y2YyYTIuc2V0Q29udGVudChodG1sX2JlZGY2YWNmMDYzNDQzNTc4YzljYWMwNmYwMjZkNTZlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2VmNjQ4YzJhNGU3MzRiNzNhYTU4Y2NlNDZkMTQ5YTFjLmJpbmRQb3B1cChwb3B1cF8yZWY5MDA3MGRkYjg0MDMyOWFmMzQ3MmU5MDRjZjJhMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iMjg3NzNmYTdlNDI0MDM4OGFhMDkyZjM0YjMyZmQ4NSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0LjkyMDUxNzIyMjkyMjc0LCAxMjguNTI1NTQ0MjU5ODI2NzddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzdkMjYwNjg2YjE3NTRjODM5ZmFkZjYzNjM2YmY1N2FiID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYjI4NzczZmE3ZTQyNDAzODhhYTA5MmYzNGIzMmZkODUuc2V0SWNvbihpY29uXzdkMjYwNjg2YjE3NTRjODM5ZmFkZjYzNjM2YmY1N2FiKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yYjcyMGE2YjEwNDU0NzY5YWQ1M2NjOGQyNTAzY2I4YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzAyM2QwY2M1YjU5NGMxNDkyMjcyMTA5OWI5ZmNmMjAgPSAkKGA8ZGl2IGlkPSJodG1sX2MwMjNkMGNjNWI1OTRjMTQ5MjI3MjEwOTliOWZjZjIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7shLHtj6zsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmI3MjBhNmIxMDQ1NDc2OWFkNTNjYzhkMjUwM2NiOGEuc2V0Q29udGVudChodG1sX2MwMjNkMGNjNWI1OTRjMTQ5MjI3MjEwOTliOWZjZjIwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2IyODc3M2ZhN2U0MjQwMzg4YWEwOTJmMzRiMzJmZDg1LmJpbmRQb3B1cChwb3B1cF8yYjcyMGE2YjEwNDU0NzY5YWQ1M2NjOGQyNTAzY2I4YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84OWYyODc3MDI4MjU0ZjJhYTliNTExNWU0YjYzNWFiZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0Ljg0OTE5NzcwOTEzNDYzLCAxMjguNTkyNjQ0NTA4OTI3ODZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzQ1MGE1NzQ3YjBkZDQ3MmNiZDZkYTA5NGUzY2U4ODE4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfODlmMjg3NzAyODI1NGYyYWE5YjUxMTVlNGI2MzVhYmYuc2V0SWNvbihpY29uXzQ1MGE1NzQ3YjBkZDQ3MmNiZDZkYTA5NGUzY2U4ODE4KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82NmExNWExNThiMTk0YTY2ODUxMGYzODZiZDFhZGQ0MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMmFkMmM5ZTRkY2UyNDhkMGI1NzFjMjdlZmY3YzAyNWEgPSAkKGA8ZGl2IGlkPSJodG1sXzJhZDJjOWU0ZGNlMjQ4ZDBiNTcxYzI3ZWZmN2MwMjVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7qsbDsoJzsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjZhMTVhMTU4YjE5NGE2Njg1MTBmMzg2YmQxYWRkNDEuc2V0Q29udGVudChodG1sXzJhZDJjOWU0ZGNlMjQ4ZDBiNTcxYzI3ZWZmN2MwMjVhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg5ZjI4NzcwMjgyNTRmMmFhOWI1MTE1ZTRiNjM1YWJmLmJpbmRQb3B1cChwb3B1cF82NmExNWExNThiMTk0YTY2ODUxMGYzODZiZDFhZGQ0MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNzdiZmM1ZTJjM2M0Nzk1YWJjNWQwY2VkMTZjM2ZlNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM0Ljg3NjY4ODc2MTgxNTA0LCAxMjguNDE4NzI2ODczNTQ4NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYjNjNDM2ZDg2ODYzNDE4NzljN2NkMjM2MjYwZjVhMzkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8yNzdiZmM1ZTJjM2M0Nzk1YWJjNWQwY2VkMTZjM2ZlNC5zZXRJY29uKGljb25fYjNjNDM2ZDg2ODYzNDE4NzljN2NkMjM2MjYwZjVhMzkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc1N2U4ZDk0ZTM1ODRjYzhiOTJiYjY5MjQ2YWMwNTllID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83MTFmZjcwYWZmNGU0YjA3OTQ0NjA3MjJjODZkNTcwOCA9ICQoYDxkaXYgaWQ9Imh0bWxfNzExZmY3MGFmZjRlNGIwNzk0NDYwNzIyYzg2ZDU3MDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyjveumvOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83NTdlOGQ5NGUzNTg0Y2M4YjkyYmI2OTI0NmFjMDU5ZS5zZXRDb250ZW50KGh0bWxfNzExZmY3MGFmZjRlNGIwNzk0NDYwNzIyYzg2ZDU3MDgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjc3YmZjNWUyYzNjNDc5NWFiYzVkMGNlZDE2YzNmZTQuYmluZFBvcHVwKHBvcHVwXzc1N2U4ZDk0ZTM1ODRjYzhiOTJiYjY5MjQ2YWMwNTllKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2E1YjRiOWJiYmQ3OTRlMDBhNjVhNWUyNDYxMGM4OWExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuODMxMDIwNTY3MDkxMDgsIDEyOC40MTc1NDk0Njg5MTY0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9lMTEyYmQyNmMyN2U0YWViYmUzYTc2Yjc4MWQxYzAxZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2E1YjRiOWJiYmQ3OTRlMDBhNjVhNWUyNDYxMGM4OWExLnNldEljb24oaWNvbl9lMTEyYmQyNmMyN2U0YWViYmUzYTc2Yjc4MWQxYzAxZCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTc5YjQxOWNlYjkyNDZmNGE5OTk2MGVkN2NhNDAxZTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzI2NzUxYjMyNzJiMzRiZmFiZDg4NTc0NzM0MDEzOTdmID0gJChgPGRpdiBpZD0iaHRtbF8yNjc1MWIzMjcyYjM0YmZhYmQ4ODU3NDczNDAxMzk3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+67SJ7Y+J7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U3OWI0MTljZWI5MjQ2ZjRhOTk5NjBlZDdjYTQwMWU5LnNldENvbnRlbnQoaHRtbF8yNjc1MWIzMjcyYjM0YmZhYmQ4ODU3NDczNDAxMzk3Zik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9hNWI0YjliYmJkNzk0ZTAwYTY1YTVlMjQ2MTBjODlhMS5iaW5kUG9wdXAocG9wdXBfZTc5YjQxOWNlYjkyNDZmNGE5OTk2MGVkN2NhNDAxZTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjNmZTQyN2U4ZDUyNDk5ODgxOWU3ODEzNGUyNjhmZWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4wOTkxNTkyMDAxOTM1LCAxMjguODA1MDU4OTY4MDEzMTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2Y3MzcyNWI3Y2M0NjQ5MzE5NjdjMTEwMDNmNzZhZjRjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYjNmZTQyN2U4ZDUyNDk5ODgxOWU3ODEzNGUyNjhmZWQuc2V0SWNvbihpY29uX2Y3MzcyNWI3Y2M0NjQ5MzE5NjdjMTEwMDNmNzZhZjRjKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82N2VjNWNlZmMyYTg0NjczYWI2MTllMGYyZTQxNzZhYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMjY0NzFiODYzN2NjNDM2NWFlYzVkNDI0ODBkNmE0MTkgPSAkKGA8ZGl2IGlkPSJodG1sXzI2NDcxYjg2MzdjYzQzNjVhZWM1ZDQyNDgwZDZhNDE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7smqnsm5DsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjdlYzVjZWZjMmE4NDY3M2FiNjE5ZTBmMmU0MTc2YWEuc2V0Q29udGVudChodG1sXzI2NDcxYjg2MzdjYzQzNjVhZWM1ZDQyNDgwZDZhNDE5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2IzZmU0MjdlOGQ1MjQ5OTg4MTllNzgxMzRlMjY4ZmVkLmJpbmRQb3B1cChwb3B1cF82N2VjNWNlZmMyYTg0NjczYWI2MTllMGYyZTQxNzZhYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80YmJlZTYwY2IwNzg0OWM4OGVlZmFhYTUxZGI4YWJkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjEwNDEzOTcxNzQ0MzAyNiwgMTI4LjcxNzU5MDU5NTI5NDhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzg5ZDM3ZDA0NDFhMDRjN2Q5ZDM4N2E0NzU1YjU2YjJiID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNGJiZWU2MGNiMDc4NDljODhlZWZhYWE1MWRiOGFiZGYuc2V0SWNvbihpY29uXzg5ZDM3ZDA0NDFhMDRjN2Q5ZDM4N2E0NzU1YjU2YjJiKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hM2NkYTFlYzkwM2U0ZmNhYjFkY2I2MzA5MzYwNzAyYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWJmNTFmOTdlMjEyNDZkYzkxZjg5ODUyMmNmMjVkNmQgPSAkKGA8ZGl2IGlkPSJodG1sXzliZjUxZjk3ZTIxMjQ2ZGM5MWY4OTg1MjJjZjI1ZDZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7so73qs6HsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTNjZGExZWM5MDNlNGZjYWIxZGNiNjMwOTM2MDcwMmMuc2V0Q29udGVudChodG1sXzliZjUxZjk3ZTIxMjQ2ZGM5MWY4OTg1MjJjZjI1ZDZkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzRiYmVlNjBjYjA3ODQ5Yzg4ZWVmYWFhNTFkYjhhYmRmLmJpbmRQb3B1cChwb3B1cF9hM2NkYTFlYzkwM2U0ZmNhYjFkY2I2MzA5MzYwNzAyYykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zNDdmN2QwNzA3NDg0MTMyOTE2MmE0ZjQzYjVkYzQ4YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjE0NzUwNTk5OTI4MjkwNiwgMTI4LjcwNDYyODA2NDg5MjEyXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl84YjIyNzBmMjczZGY0ZGFkYTdiOWQ5OTdhMDY2ZTNkMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzM0N2Y3ZDA3MDc0ODQxMzI5MTYyYTRmNDNiNWRjNDhiLnNldEljb24oaWNvbl84YjIyNzBmMjczZGY0ZGFkYTdiOWQ5OTdhMDY2ZTNkMSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjcwNTc0YzU5NWUyNDcyZTliMDRhNGE5YmM3OTdhZTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzg5N2ViN2ExODBlODRkMDI5YmZlZTJmZmRkNDNmNTZiID0gJChgPGRpdiBpZD0iaHRtbF84OTdlYjdhMTgwZTg0ZDAyOWJmZWUyZmZkZDQzZjU2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Iug7J2064+Z7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzI3MDU3NGM1OTVlMjQ3MmU5YjA0YTRhOWJjNzk3YWU0LnNldENvbnRlbnQoaHRtbF84OTdlYjdhMTgwZTg0ZDAyOWJmZWUyZmZkZDQzZjU2Yik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zNDdmN2QwNzA3NDg0MTMyOTE2MmE0ZjQzYjVkYzQ4Yi5iaW5kUG9wdXAocG9wdXBfMjcwNTc0YzU5NWUyNDcyZTliMDRhNGE5YmM3OTdhZTQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDIzOGZhMDliZTA0NGIzYjliZjVjMzY3OGY4NmMxY2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xNTY5MzM1MjA0MjQ2NiwgMTI4LjY5Mzc4NTIzNjk2MjJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzA3NzNkZThlMWZiYzQ5NDk4ZTMyMGJlZGNhYmQyMDkwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNDIzOGZhMDliZTA0NGIzYjliZjVjMzY3OGY4NmMxY2Quc2V0SWNvbihpY29uXzA3NzNkZThlMWZiYzQ5NDk4ZTMyMGJlZGNhYmQyMDkwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82MTljYmYwNzI2YjQ0ZjBhOTc4OTJjNzQ3YmU4NzE1NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTUwYTgyZDE1NjJlNGJmZDg2MTJmYzMxOWM1ZTNiY2UgPSAkKGA8ZGl2IGlkPSJodG1sXzk1MGE4MmQxNTYyZTRiZmQ4NjEyZmMzMTljNWUzYmNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7shJ3rj5nCt+qyve2ZlOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF82MTljYmYwNzI2YjQ0ZjBhOTc4OTJjNzQ3YmU4NzE1NC5zZXRDb250ZW50KGh0bWxfOTUwYTgyZDE1NjJlNGJmZDg2MTJmYzMxOWM1ZTNiY2UpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNDIzOGZhMDliZTA0NGIzYjliZjVjMzY3OGY4NmMxY2QuYmluZFBvcHVwKHBvcHVwXzYxOWNiZjA3MjZiNDRmMGE5Nzg5MmM3NDdiZTg3MTU0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2VjMmE0Nzc4OWYzZTRiMTBiYWRiMjkyM2Q2MTJkMjVmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzUyNjE5MTAwMDQwMTgsIDEyOC42NTY4Nzk5Mzk5MjA2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl81M2E1Yzc4ZTgwNWY0MGZkOWI5OWZhMzViMzcyNGJhMiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2VjMmE0Nzc4OWYzZTRiMTBiYWRiMjkyM2Q2MTJkMjVmLnNldEljb24oaWNvbl81M2E1Yzc4ZTgwNWY0MGZkOWI5OWZhMzViMzcyNGJhMik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWYzZjcwZTQ1MjYyNDE4YmE4MzJjMzIzY2ViZWUwMmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzgxNDVkYmFhNjc2MzQ3YWY5YWMzNWNjZWIwZjRiNmYyID0gJChgPGRpdiBpZD0iaHRtbF84MTQ1ZGJhYTY3NjM0N2FmOWFjMzVjY2ViMGY0YjZmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+67SJ6rCV7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VmM2Y3MGU0NTI2MjQxOGJhODMyYzMyM2NlYmVlMDJmLnNldENvbnRlbnQoaHRtbF84MTQ1ZGJhYTY3NjM0N2FmOWFjMzVjY2ViMGY0YjZmMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lYzJhNDc3ODlmM2U0YjEwYmFkYjI5MjNkNjEyZDI1Zi5iaW5kUG9wdXAocG9wdXBfZWYzZjcwZTQ1MjYyNDE4YmE4MzJjMzIzY2ViZWUwMmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjQ5YWEwMmM2Y2I0NGVhMjlhN2JmMzNlY2U4MDU3MDEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMjczOTQyMTA2NjgzODYsIDEyOC42OTIwMTA4MjIwNDU1Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYTc4MGYyNDE2Yjg3NDU5ZDgyNTQ3MzdiYTJiOGU1ZGQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8yNDlhYTAyYzZjYjQ0ZWEyOWE3YmYzM2VjZTgwNTcwMS5zZXRJY29uKGljb25fYTc4MGYyNDE2Yjg3NDU5ZDgyNTQ3MzdiYTJiOGU1ZGQpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzM5YTA0NTg5YjM4NzQ5Zjc5OWI0NWRkZmRlNDhkMGM5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83ZjRmMzJlODI5NzM0MzczOThjZTUxYjczNjEzZDZiMSA9ICQoYDxkaXYgaWQ9Imh0bWxfN2Y0ZjMyZTgyOTczNDM3Mzk4Y2U1MWI3MzYxM2Q2YjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyLoOyblOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zOWEwNDU4OWIzODc0OWY3OTliNDVkZGZkZTQ4ZDBjOS5zZXRDb250ZW50KGh0bWxfN2Y0ZjMyZTgyOTczNDM3Mzk4Y2U1MWI3MzYxM2Q2YjEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMjQ5YWEwMmM2Y2I0NGVhMjlhN2JmMzNlY2U4MDU3MDEuYmluZFBvcHVwKHBvcHVwXzM5YTA0NTg5YjM4NzQ5Zjc5OWI0NWRkZmRlNDhkMGM5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzk2YmUwNDc2MTJiYzRlY2ZhYzVjN2Y4ZWMyY2M2MGY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjQxMjQ3ODgxMjk5MjEsIDEyOC42NDgzODQ1OTg5NDM5NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYzcyNDA0Y2IzNDE5NDdkY2FlYmJmMDFkY2RiYWI2MmMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl85NmJlMDQ3NjEyYmM0ZWNmYWM1YzdmOGVjMmNjNjBmOC5zZXRJY29uKGljb25fYzcyNDA0Y2IzNDE5NDdkY2FlYmJmMDFkY2RiYWI2MmMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U2MWJiMzM1MWVhZDQ5MDQ5MWYyYTk5YjkwNjdkMmE3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xNWZhYzM1OGNmYzE0MmJjOTJjYzBmNTdlZTRlOTJhYiA9ICQoYDxkaXYgaWQ9Imh0bWxfMTVmYWMzNThjZmMxNDJiYzkyY2MwZjU3ZWU0ZTkyYWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuqheyEnOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lNjFiYjMzNTFlYWQ0OTA0OTFmMmE5OWI5MDY3ZDJhNy5zZXRDb250ZW50KGh0bWxfMTVmYWMzNThjZmMxNDJiYzkyY2MwZjU3ZWU0ZTkyYWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOTZiZTA0NzYxMmJjNGVjZmFjNWM3ZjhlYzJjYzYwZjguYmluZFBvcHVwKHBvcHVwX2U2MWJiMzM1MWVhZDQ5MDQ5MWYyYTk5YjkwNjdkMmE3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBjODA5NTU0NDk2NjRlMTFhMjJlMDZmZmU1OWIxOWJhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjE5NTY3ODEwMjcxMjE1LCAxMjguNzA0MzU5MTU2Mjc1Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMzgzMWRiNTQ5ZDJjNDg5MDkwM2U5OTYyYmYyMmI1YTggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8wYzgwOTU1NDQ5NjY0ZTExYTIyZTA2ZmZlNTliMTliYS5zZXRJY29uKGljb25fMzgzMWRiNTQ5ZDJjNDg5MDkwM2U5OTYyYmYyMmI1YTgpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzI0ZTIwYzk0ODYwZDRhM2ZiYjM1MmIyMTUzNTAyYTI5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85Y2RiYjYzMGJhNTc0Mzc2YjJjODNlYTRjNmQyZmNmOSA9ICQoYDxkaXYgaWQ9Imh0bWxfOWNkYmI2MzBiYTU3NDM3NmIyYzgzZWE0YzZkMmZjZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuPmeyEseygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8yNGUyMGM5NDg2MGQ0YTNmYmIzNTJiMjE1MzUwMmEyOS5zZXRDb250ZW50KGh0bWxfOWNkYmI2MzBiYTU3NDM3NmIyYzgzZWE0YzZkMmZjZjkpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMGM4MDk1NTQ0OTY2NGUxMWEyMmUwNmZmZTU5YjE5YmEuYmluZFBvcHVwKHBvcHVwXzI0ZTIwYzk0ODYwZDRhM2ZiYjM1MmIyMTUzNTAyYTI5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2U3YzYyNTk5YjJkZjRmYmE4ZjI5OTdhZmMzMzQ0ZjQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjYwOTA0ODA2MjE5MjY2LCAxMjguNjM4NjAzNTYzNTQ3OTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzFlODE2YzVhMjc3MDQ1Yjc4NTMyZGJkMzg0ZTFiOTFkID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTdjNjI1OTliMmRmNGZiYThmMjk5N2FmYzMzNDRmNDIuc2V0SWNvbihpY29uXzFlODE2YzVhMjc3MDQ1Yjc4NTMyZGJkMzg0ZTFiOTFkKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kN2ZkNjI2NDhmYjQ0OTRkOGU3Y2VkM2I4MjU3YzcwZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNjA1OGI4ZGFiZGQxNGNlNWJlM2Y4NWM1NGQzZThiYzcgPSAkKGA8ZGl2IGlkPSJodG1sXzYwNThiOGRhYmRkMTRjZTViZTNmODVjNTRkM2U4YmM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rj4Tqs4Qy7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q3ZmQ2MjY0OGZiNDQ5NGQ4ZTdjZWQzYjgyNTdjNzBlLnNldENvbnRlbnQoaHRtbF82MDU4YjhkYWJkZDE0Y2U1YmUzZjg1YzU0ZDNlOGJjNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lN2M2MjU5OWIyZGY0ZmJhOGYyOTk3YWZjMzM0NGY0Mi5iaW5kUG9wdXAocG9wdXBfZDdmZDYyNjQ4ZmI0NDk0ZDhlN2NlZDNiODI1N2M3MGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2ExMTgxOTUwN2QxNDRlNDgwZmFiODQ3ZWVmMDI0YjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yNjI2MzE4MDA4NDgxMywgMTI4LjYyNjI5NjU1OTIwNTVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzcxMmYzNTAyZDkxYTQzNzViNWVhMTEyMDY5NDQ4NmJjID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfY2ExMTgxOTUwN2QxNDRlNDgwZmFiODQ3ZWVmMDI0YjYuc2V0SWNvbihpY29uXzcxMmYzNTAyZDkxYTQzNzViNWVhMTEyMDY5NDQ4NmJjKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kOTlkM2M2YTZkNDY0OWNhYmEzMWIzNWNhNmI3ZDQzOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZjFjYWJiY2M1MjU3NDQ4YWEwNjQyYzA5MTViZjQ3ZmYgPSAkKGA8ZGl2IGlkPSJodG1sX2YxY2FiYmNjNTI1NzQ0OGFhMDY0MmMwOTE1YmY0N2ZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7shozri7XsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDk5ZDNjNmE2ZDQ2NDljYWJhMzFiMzVjYTZiN2Q0Mzguc2V0Q29udGVudChodG1sX2YxY2FiYmNjNTI1NzQ0OGFhMDY0MmMwOTE1YmY0N2ZmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2NhMTE4MTk1MDdkMTQ0ZTQ4MGZhYjg0N2VlZjAyNGI2LmJpbmRQb3B1cChwb3B1cF9kOTlkM2M2YTZkNDY0OWNhYmEzMWIzNWNhNmI3ZDQzOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9kNDllODcyOWY2NzQ0MjQ2YjQyOTFiNjVjNzU2MmExYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI2MjY2NTA0NTU0NDk1NiwgMTI4LjYxNjI4NDg4ODc0NTldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzgwMDU2NDE1YzczODRiNTg5Y2QyZmI3ZjcxNGE0NjM3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZDQ5ZTg3MjlmNjc0NDI0NmI0MjkxYjY1Yzc1NjJhMWMuc2V0SWNvbihpY29uXzgwMDU2NDE1YzczODRiNTg5Y2QyZmI3ZjcxNGE0NjM3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82N2RkYjRlODY5Y2U0MTU5OTIwMjNiOWE5ZWMzNDNiYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWE4N2ZkNzkyNzRiNDJlYWFjMGY3NWQ5Y2VhZGQ3NjkgPSAkKGA8ZGl2IGlkPSJodG1sXzlhODdmZDc5Mjc0YjQyZWFhYzBmNzVkOWNlYWRkNzY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7shJzsg4HsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjdkZGI0ZTg2OWNlNDE1OTkyMDIzYjlhOWVjMzQzYmIuc2V0Q29udGVudChodG1sXzlhODdmZDc5Mjc0YjQyZWFhYzBmNzVkOWNlYWRkNzY5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Q0OWU4NzI5ZjY3NDQyNDZiNDI5MWI2NWM3NTYyYTFjLmJpbmRQb3B1cChwb3B1cF82N2RkYjRlODY5Y2U0MTU5OTIwMjNiOWE5ZWMzNDNiYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81NWFhZjljMTg0NGY0MmQ1OGVkYWM4YmNjODA1N2E0OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI1MzYxMDE3MTgyODE4NiwgMTI4LjYxOTIwMzM3NTg3ODldLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzhmMjczYTRlMmNkZjQwMDI4MDFhNDI4MTY5ZDc5NDgxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNTVhYWY5YzE4NDRmNDJkNThlZGFjOGJjYzgwNTdhNDkuc2V0SWNvbihpY29uXzhmMjczYTRlMmNkZjQwMDI4MDFhNDI4MTY5ZDc5NDgxKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hY2QxNTQzZjBmZjQ0ZGVjOTY2MWFiNGFkNDQ0NDRlYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMDg0NDZkZGE0OWY4NGVmN2E0ZTRmNDkxMjM1MmEyMzggPSAkKGA8ZGl2IGlkPSJodG1sXzA4NDQ2ZGRhNDlmODRlZjdhNGU0ZjQ5MTIzNTJhMjM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7tjJTsmqnsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWNkMTU0M2YwZmY0NGRlYzk2NjFhYjRhZDQ0NDQ0ZWEuc2V0Q29udGVudChodG1sXzA4NDQ2ZGRhNDlmODRlZjdhNGU0ZjQ5MTIzNTJhMjM4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzU1YWFmOWMxODQ0ZjQyZDU4ZWRhYzhiY2M4MDU3YTQ5LmJpbmRQb3B1cChwb3B1cF9hY2QxNTQzZjBmZjQ0ZGVjOTY2MWFiNGFkNDQ0NDRlYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl80NDdkYzgzOGNkY2Q0YmE2YmRiMmM1NTdjNWZjNDY3MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI0NDE4NTgyMDE0NDc4NiwgMTI4LjY1MTI5NTkxMTU0MjIzXSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl83ZWMxYmJhMGU3MTk0YTNjYTRhYzYzYjVjNTkxZjU2ZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzQ0N2RjODM4Y2RjZDRiYTZiZGIyYzU1N2M1ZmM0NjcyLnNldEljb24oaWNvbl83ZWMxYmJhMGU3MTk0YTNjYTRhYzYzYjVjNTkxZjU2Zik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTg4MDdlYjQ2MzdjNGYzN2FlN2EyM2VhYWFlNzY2YTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY3ZTZlZTI1MGUwYzQzM2M5Nzc0MmUyNjA3YmYyOTMwID0gJChgPGRpdiBpZD0iaHRtbF82N2U2ZWUyNTBlMGM0MzNjOTc3NDJlMjYwN2JmMjkzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+66qF6rOh7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzE4ODA3ZWI0NjM3YzRmMzdhZTdhMjNlYWFhZTc2NmE5LnNldENvbnRlbnQoaHRtbF82N2U2ZWUyNTBlMGM0MzNjOTc3NDJlMjYwN2JmMjkzMCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80NDdkYzgzOGNkY2Q0YmE2YmRiMmM1NTdjNWZjNDY3Mi5iaW5kUG9wdXAocG9wdXBfMTg4MDdlYjQ2MzdjNGYzN2FlN2EyM2VhYWFlNzY2YTkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjJkZWViMjk0YTgyNDc3MjllMWNlMGU1Nzc1MTBmM2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yNDYzMzk2MjI5MzA1MzUsIDEyOC42NzExMjcyMDcwMzQ5N10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZTFlNjVjYWZiODNiNDZjYmJjNzg1MTkxYjQ2OWMxZjcgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl82MmRlZWIyOTRhODI0NzcyOWUxY2UwZTU3NzUxMGYzZC5zZXRJY29uKGljb25fZTFlNjVjYWZiODNiNDZjYmJjNzg1MTkxYjQ2OWMxZjcpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZiN2Q1ZGY5NjdkNjQzNjg4YjY4ZDA2Mzg3ZWNiZGVkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85NDllYmUwODA4Zjg0N2U3YmJhYWRhZDZmNTM3NWVkZCA9ICQoYDxkaXYgaWQ9Imh0bWxfOTQ5ZWJlMDgwOGY4NDdlN2JiYWFkYWQ2ZjUzNzVlZGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuu0ieqzoeygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF82YjdkNWRmOTY3ZDY0MzY4OGI2OGQwNjM4N2VjYmRlZC5zZXRDb250ZW50KGh0bWxfOTQ5ZWJlMDgwOGY4NDdlN2JiYWFkYWQ2ZjUzNzVlZGQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjJkZWViMjk0YTgyNDc3MjllMWNlMGU1Nzc1MTBmM2QuYmluZFBvcHVwKHBvcHVwXzZiN2Q1ZGY5NjdkNjQzNjg4YjY4ZDA2Mzg3ZWNiZGVkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzEyMjZlNWU0Nzk1ZDQ0NGRiMmE4MDM1ZTQ1MWM1YmM0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjQxNzc1OTM1OTI2OTksIDEyOC42ODc0ODQ5MDkwNjc5M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZGI2YzQ4NGM4ZTkwNDVhY2I0OWVlZDMyZGYxODFjOWIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8xMjI2ZTVlNDc5NWQ0NDRkYjJhODAzNWU0NTFjNWJjNC5zZXRJY29uKGljb25fZGI2YzQ4NGM4ZTkwNDVhY2I0OWVlZDMyZGYxODFjOWIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U3YmM2NDljZWQ0YzQwZGZiOGNkOTgyYWIzYzhkOGVlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lMTZkYzYxMGE1NWU0ZDZhYTNmMTdkZTlmOTE4ZThmMyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTE2ZGM2MTBhNTVlNGQ2YWEzZjE3ZGU5ZjkxOGU4ZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuywveybkOuMgOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lN2JjNjQ5Y2VkNGM0MGRmYjhjZDk4MmFiM2M4ZDhlZS5zZXRDb250ZW50KGh0bWxfZTE2ZGM2MTBhNTVlNGQ2YWEzZjE3ZGU5ZjkxOGU4ZjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTIyNmU1ZTQ3OTVkNDQ0ZGIyYTgwMzVlNDUxYzViYzQuYmluZFBvcHVwKHBvcHVwX2U3YmM2NDljZWQ0YzQwZGZiOGNkOTgyYWIzYzhkOGVlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2Y5MjJiNDRlYTJmNDRhZjZhMTMzZDVlZDU0YzY5ODVlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjQyNzUzODk0NTQ2ODgsIDEyOC42ODM1Mjg1MDc1MjQ2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9mYzZkNmNjY2Y5Yjc0NDQxODZhZmIzMmI0MjM5NmZjMSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2Y5MjJiNDRlYTJmNDRhZjZhMTMzZDVlZDU0YzY5ODVlLnNldEljb24oaWNvbl9mYzZkNmNjY2Y5Yjc0NDQxODZhZmIzMmI0MjM5NmZjMSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGE2YTFjZTlhNzFiNDAzZTg2Zjk0MWY5YTVjNGFiOGEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzBmNjA0ZDdlNjY5ODQwZmI5ZjFhMDY2Yjg2YzMwZjliID0gJChgPGRpdiBpZD0iaHRtbF8wZjYwNGQ3ZTY2OTg0MGZiOWYxYTA2NmI4NmMzMGY5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7IKs66a87KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzRhNmExY2U5YTcxYjQwM2U4NmY5NDFmOWE1YzRhYjhhLnNldENvbnRlbnQoaHRtbF8wZjYwNGQ3ZTY2OTg0MGZiOWYxYTA2NmI4NmMzMGY5Yik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9mOTIyYjQ0ZWEyZjQ0YWY2YTEzM2Q1ZWQ1NGM2OTg1ZS5iaW5kUG9wdXAocG9wdXBfNGE2YTFjZTlhNzFiNDAzZTg2Zjk0MWY5YTVjNGFiOGEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2FhZTlmMGRlNzQxNDljZTk1ZjI4MjRlYzZkM2FmYmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xODc0MDU4MjExNDAxNzUsIDEyOC42OTIyMzA3MjcxODc3M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZDJmNjZlYTcyODM0NDFkZGJkN2ZkMTJlOTA2YjEzYzkgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9jYWFlOWYwZGU3NDE0OWNlOTVmMjgyNGVjNmQzYWZiZS5zZXRJY29uKGljb25fZDJmNjZlYTcyODM0NDFkZGJkN2ZkMTJlOTA2YjEzYzkpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzU2YTVhZTdhMzRhODQyYjQ5MjcyOTRiNjU4Y2M2N2M5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jZGQ5OGUxZWRkNjE0NWU5Yjg3MzlhOTJlYTY3NjRmMyA9ICQoYDxkaXYgaWQ9Imh0bWxfY2RkOThlMWVkZDYxNDVlOWI4NzM5YTkyZWE2NzY0ZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyEseyjvOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF81NmE1YWU3YTM0YTg0MmI0OTI3Mjk0YjY1OGNjNjdjOS5zZXRDb250ZW50KGh0bWxfY2RkOThlMWVkZDYxNDVlOWI4NzM5YTkyZWE2NzY0ZjMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2FhZTlmMGRlNzQxNDljZTk1ZjI4MjRlYzZkM2FmYmUuYmluZFBvcHVwKHBvcHVwXzU2YTVhZTdhMzRhODQyYjQ5MjcyOTRiNjU4Y2M2N2M5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzE4MjNkN2UwMTRjNTQ4MmRhMDkzNDc2MDk2YmE5NTkwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjA3NTkyMTc5MzA1MiwgMTI4LjcxMjA0MTEwMjM5NDk4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kMzYyYmY1N2YxZTU0OTM3YjFhYmI2YWU2MWVkNTg4ZSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzE4MjNkN2UwMTRjNTQ4MmRhMDkzNDc2MDk2YmE5NTkwLnNldEljb24oaWNvbl9kMzYyYmY1N2YxZTU0OTM3YjFhYmI2YWU2MWVkNTg4ZSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzcwNzMwMWJhZmNjNDdmN2JlZmYyNDI5ZmJlOWIwYjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2M2MWQ5ZDg5NzZhYTQ0ZDg5YTU1NzZlMzQxMDMzZWQ2ID0gJChgPGRpdiBpZD0iaHRtbF9jNjFkOWQ4OTc2YWE0NGQ4OWE1NTc2ZTM0MTAzM2VkNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64yA67CpMuygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jNzA3MzAxYmFmY2M0N2Y3YmVmZjI0MjlmYmU5YjBiMS5zZXRDb250ZW50KGh0bWxfYzYxZDlkODk3NmFhNDRkODlhNTU3NmUzNDEwMzNlZDYpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMTgyM2Q3ZTAxNGM1NDgyZGEwOTM0NzYwOTZiYTk1OTAuYmluZFBvcHVwKHBvcHVwX2M3MDczMDFiYWZjYzQ3ZjdiZWZmMjQyOWZiZTliMGIxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2MzN2QyYzU3YjI5YTRmN2M5OWY4NDQzNWMzNDA1N2MyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjA5NTgzMTQzNTI4NTEsIDEyOC43MDE3MzkwMzk5Nzk1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl80NDJjMDdiNGM2MWI0YWZhODY3YWNhYzM0NTAwMTc0MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2MzN2QyYzU3YjI5YTRmN2M5OWY4NDQzNWMzNDA1N2MyLnNldEljb24oaWNvbl80NDJjMDdiNGM2MWI0YWZhODY3YWNhYzM0NTAwMTc0Myk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWNmMjIzZDRkNDA0NGY5OWI4ZjRlNTU4YzM1OGJlZjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2I5MzI1ZjE5N2I0ZjRiMTE4NTIzNmJhNzdiNTlkODQ0ID0gJChgPGRpdiBpZD0iaHRtbF9iOTMyNWYxOTdiNGY0YjExODUyMzZiYTc3YjU5ZDg0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+6rCc64KY66as7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2FjZjIyM2Q0ZDQwNDRmOTliOGY0ZTU1OGMzNThiZWY4LnNldENvbnRlbnQoaHRtbF9iOTMyNWYxOTdiNGY0YjExODUyMzZiYTc3YjU5ZDg0NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jMzdkMmM1N2IyOWE0ZjdjOTlmODQ0MzVjMzQwNTdjMi5iaW5kUG9wdXAocG9wdXBfYWNmMjIzZDRkNDA0NGY5OWI4ZjRlNTU4YzM1OGJlZjgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTNhYmU2ZjEyYjA4NGRhNDg5MTk2YzlkN2MxODNkNzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMTY2NzE1MTI4NTQ0NiwgMTI4LjY3MDA3OTQ3OTM5Njc4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl80ZmJiMzE2OGM5ZDc0ZWVjYmFiODNlYTJjZDc0ZjNmMCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzkzYWJlNmYxMmIwODRkYTQ4OTE5NmM5ZDdjMTgzZDc5LnNldEljb24oaWNvbl80ZmJiMzE2OGM5ZDc0ZWVjYmFiODNlYTJjZDc0ZjNmMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfN2M0YTRlYzUxZGUyNDQyMWFmM2FkNzRkN2JjMjM2ZjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzkyMDkwMTI5ZTJiNjQ1NTBhOTA5N2FlMTNhMzQxYzhkID0gJChgPGRpdiBpZD0iaHRtbF85MjA5MDEyOWUyYjY0NTUwYTkwOTdhZTEzYTM0MWM4ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64K064+Z7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzdjNGE0ZWM1MWRlMjQ0MjFhZjNhZDc0ZDdiYzIzNmYxLnNldENvbnRlbnQoaHRtbF85MjA5MDEyOWUyYjY0NTUwYTkwOTdhZTEzYTM0MWM4ZCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85M2FiZTZmMTJiMDg0ZGE0ODkxOTZjOWQ3YzE4M2Q3OS5iaW5kUG9wdXAocG9wdXBfN2M0YTRlYzUxZGUyNDQyMWFmM2FkNzRkN2JjMjM2ZjEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTZmOGM4MDU2NmY5NDk5ZjhlNzQ5NmU3ZmI1N2NiOGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMTQ4Mjc2NTY1ODcyNywgMTI4LjY4ODY1MzE2Nzk3Njc4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl80MDc0ZDZjZDQyOTg0ZWI0YjFkN2QyYzEyODhlM2M5NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzE2ZjhjODA1NjZmOTQ5OWY4ZTc0OTZlN2ZiNTdjYjhjLnNldEljb24oaWNvbl80MDc0ZDZjZDQyOTg0ZWI0YjFkN2QyYzEyODhlM2M5NCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTgyZjhhMjU5ZWYwNDNiNzg2Y2NlMmQ0YTY5MjA2NzMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzAyOTNlYzQwM2FhMTQ4NjNhYzE5M2ExNTNhMWQ3Njg0ID0gJChgPGRpdiBpZD0iaHRtbF8wMjkzZWM0MDNhYTE0ODYzYWMxOTNhMTUzYTFkNzY4NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Yag7JuU7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2E4MmY4YTI1OWVmMDQzYjc4NmNjZTJkNGE2OTIwNjczLnNldENvbnRlbnQoaHRtbF8wMjkzZWM0MDNhYTE0ODYzYWMxOTNhMTUzYTFkNzY4NCk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xNmY4YzgwNTY2Zjk0OTlmOGU3NDk2ZTdmYjU3Y2I4Yy5iaW5kUG9wdXAocG9wdXBfYTgyZjhhMjU5ZWYwNDNiNzg2Y2NlMmQ0YTY5MjA2NzMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDgxZjlhMWM1MjQ5NDBjNDgwNWUyYTY0OGU3OTBiNDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xMDg0MTg2MDYwNzY2MjYsIDEyOC4yMzgwMjEwMzM0ODY4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kNGZhZjBiOWU5Mzc0NmU0YTJkZDAwNWZlNzJkYjY1NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzQ4MWY5YTFjNTI0OTQwYzQ4MDVlMmE2NDhlNzkwYjQ3LnNldEljb24oaWNvbl9kNGZhZjBiOWU5Mzc0NmU0YTJkZDAwNWZlNzJkYjY1NCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTI0MjA1YzljMjQ4NGI2YjlhOWQ4ZDY1MWZjMjRkZDcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzgyNGNiZThiZjg3YTQ5MTVhZDI3Y2Y3ZTU0NWRjMzczID0gJChgPGRpdiBpZD0iaHRtbF84MjRjYmU4YmY4N2E0OTE1YWQyN2NmN2U1NDVkYzM3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7JiB7Jik7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2EyNDIwNWM5YzI0ODRiNmI5YTlkOGQ2NTFmYzI0ZGQ3LnNldENvbnRlbnQoaHRtbF84MjRjYmU4YmY4N2E0OTE1YWQyN2NmN2U1NDVkYzM3Myk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl80ODFmOWExYzUyNDk0MGM0ODA1ZTJhNjQ4ZTc5MGI0Ny5iaW5kUG9wdXAocG9wdXBfYTI0MjA1YzljMjQ4NGI2YjlhOWQ4ZDY1MWZjMjRkZDcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfM2MzYjI5YmZkNTNmNGI0OGE5ZWJhMzBlZjQ5OGE0ZjggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNC45Mjc4NDYwMzkxMzMyMSwgMTI4LjEyMjMxMjY0ODQwMTNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzdmZDAxOTFkZWUwZTQwN2RhZWI3OTU3NWE1YTllMmZhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfM2MzYjI5YmZkNTNmNGI0OGE5ZWJhMzBlZjQ5OGE0Zjguc2V0SWNvbihpY29uXzdmZDAxOTFkZWUwZTQwN2RhZWI3OTU3NWE1YTllMmZhKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMzU0MjY1NzZmZGY0YWM3YmFmZmRiMjZjYzM3NjZjMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMTY1MTFhNzdkN2FiNDAzZjljZTUyMTRkMjA1ODgzMGUgPSAkKGA8ZGl2IGlkPSJodG1sXzE2NTExYTc3ZDdhYjQwM2Y5Y2U1MjE0ZDIwNTg4MzBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7tlZjsnbTsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTM1NDI2NTc2ZmRmNGFjN2JhZmZkYjI2Y2MzNzY2YzIuc2V0Q29udGVudChodG1sXzE2NTExYTc3ZDdhYjQwM2Y5Y2U1MjE0ZDIwNTg4MzBlKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzNjM2IyOWJmZDUzZjRiNDhhOWViYTMwZWY0OThhNGY4LmJpbmRQb3B1cChwb3B1cF9lMzU0MjY1NzZmZGY0YWM3YmFmZmRiMjZjYzM3NjZjMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82NTQ4MjYyZDNhYTU0ZDdiODQ2YjU5ZjQ4YmIxZWE2ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjA0MTgxNzMwODg3NDkyNiwgMTI4LjQyMjA1MzkzNDIzNDhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2MxYjFiMDA1NjA5ODQ0ZTBiZmRiYjUzOTgyNjliMTg4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNjU0ODI2MmQzYWE1NGQ3Yjg0NmI1OWY0OGJiMWVhNmQuc2V0SWNvbihpY29uX2MxYjFiMDA1NjA5ODQ0ZTBiZmRiYjUzOTgyNjliMTg4KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82M2NlYzEzN2E4NmQ0OTUwODRiZTk4ZWNkODVkOGI0MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWEyMTkyYmNiNDhkNDYyZWIwN2QzZGJiNjY0MWJmM2QgPSAkKGA8ZGl2IGlkPSJodG1sXzlhMjE5MmJjYjQ4ZDQ2MmViMDdkM2RiYjY2NDFiZjNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rj5ntlbTsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjNjZWMxMzdhODZkNDk1MDg0YmU5OGVjZDg1ZDhiNDEuc2V0Q29udGVudChodG1sXzlhMjE5MmJjYjQ4ZDQ2MmViMDdkM2RiYjY2NDFiZjNkKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY1NDgyNjJkM2FhNTRkN2I4NDZiNTlmNDhiYjFlYTZkLmJpbmRQb3B1cChwb3B1cF82M2NlYzEzN2E4NmQ0OTUwODRiZTk4ZWNkODVkOGI0MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zZWZmMTY3MjQ3ODA0ZjVhYTY2ODUyODc4M2Q0YTUxOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjA1NjQ1NTM0MjU0MzkxLCAxMjguMzY4OTk0Njc4NzEyNTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2YxNGI5MDk0ZDA4NzQyNjI5ZmRkY2FkMjYwZDA5OWU3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfM2VmZjE2NzI0NzgwNGY1YWE2Njg1Mjg3ODNkNGE1MTkuc2V0SWNvbihpY29uX2YxNGI5MDk0ZDA4NzQyNjI5ZmRkY2FkMjYwZDA5OWU3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xYThhOTMxNGY5MWI0M2YwYTg0OWJmN2RhYjE4NzMwZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2E1YWUxMTg0YzBmNDdhY2JjM2UzN2E4YTQzYzU0MzkgPSAkKGA8ZGl2IGlkPSJodG1sXzNhNWFlMTE4NGMwZjQ3YWNiYzNlMzdhOGE0M2M1NDM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rsLDrkZTsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMWE4YTkzMTRmOTFiNDNmMGE4NDliZjdkYWIxODczMGQuc2V0Q29udGVudChodG1sXzNhNWFlMTE4NGMwZjQ3YWNiYzNlMzdhOGE0M2M1NDM5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzNlZmYxNjcyNDc4MDRmNWFhNjY4NTI4NzgzZDRhNTE5LmJpbmRQb3B1cChwb3B1cF8xYThhOTMxNGY5MWI0M2YwYTg0OWJmN2RhYjE4NzMwZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMWRjNjRlYzk1M2E0YTIxYWViMDc5MDZhYTI2OWIyNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjMwMzM1MjQxODM2MDM3NiwgMTI4LjUyMTYyNDc4MTI0Mjg1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl81OTRjNWNjNTM1Yjk0ZTRiODRlNzdhMmE2NDU3MWVjYiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzMxZGM2NGVjOTUzYTRhMjFhZWIwNzkwNmFhMjY5YjI3LnNldEljb24oaWNvbl81OTRjNWNjNTM1Yjk0ZTRiODRlNzdhMmE2NDU3MWVjYik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjYxZDI2ZDJhYzU1NDE3MTgwYjhmZWRiYjIyNjVjMDkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2E1MzViZjFjODc2NzQxZTU4Yzc5NzE3ZTRiMDg5YmMyID0gJChgPGRpdiBpZD0iaHRtbF9hNTM1YmYxYzg3Njc0MWU1OGM3OTcxN2U0YjA4OWJjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Lmg7JuQ7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y2MWQyNmQyYWM1NTQxNzE4MGI4ZmVkYmIyMjY1YzA5LnNldENvbnRlbnQoaHRtbF9hNTM1YmYxYzg3Njc0MWU1OGM3OTcxN2U0YjA4OWJjMik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8zMWRjNjRlYzk1M2E0YTIxYWViMDc5MDZhYTI2OWIyNy5iaW5kUG9wdXAocG9wdXBfZjYxZDI2ZDJhYzU1NDE3MTgwYjhmZWRiYjIyNjVjMDkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWUwMWExMGJiMGQ4NGYzODgzZTk3YzY1MjMzMzFiYWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zNTQwMDYzMjU0MDM1NywgMTI4LjQyNzI3MzI3MDA3MzA3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kMWQ5ZjBkZTY1ZDQ0MjQ1YTZkZTk4MGM4ZmUxYjQwNCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzllMDFhMTBiYjBkODRmMzg4M2U5N2M2NTIzMzMxYmFlLnNldEljb24oaWNvbl9kMWQ5ZjBkZTY1ZDQ0MjQ1YTZkZTk4MGM4ZmUxYjQwNCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTQ5ZDA0NjAwZmJjNDY1MjgxMTBmMzQzYjI3YzliZjIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2VhMTExZDYyOGUzMjRlN2ViY2NlZjhmOWUyYjIyNjU1ID0gJChgPGRpdiBpZD0iaHRtbF9lYTExMWQ2MjhlMzI0ZTdlYmNjZWY4ZjllMmIyMjY1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64yA7IKw7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2E0OWQwNDYwMGZiYzQ2NTI4MTEwZjM0M2IyN2M5YmYyLnNldENvbnRlbnQoaHRtbF9lYTExMWQ2MjhlMzI0ZTdlYmNjZWY4ZjllMmIyMjY1NSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl85ZTAxYTEwYmIwZDg0ZjM4ODNlOTdjNjUyMzMzMWJhZS5iaW5kUG9wdXAocG9wdXBfYTQ5ZDA0NjAwZmJjNDY1MjgxMTBmMzQzYjI3YzliZjIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWM3MWI2YzllOTI5NGUxYzg1MjFlMmM2MDg3N2I4ZDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zMTc5OTkzODk2NDUxLCAxMjguMzg2MTE3OTk2OTQ1Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZDI5NWY2MDY0NzQ2NDY1MmE1ZTRkMjVkOTUwOGUxNzggPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl81YzcxYjZjOWU5Mjk0ZTFjODUyMWUyYzYwODc3YjhkMi5zZXRJY29uKGljb25fZDI5NWY2MDY0NzQ2NDY1MmE1ZTRkMjVkOTUwOGUxNzgpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2IyZTVkMDVjNjRjNTQ2OTM5NzJkZDk4NmIyMDc4Y2M2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mNmIxZmMyYzlhMjY0MTc4YTMyNjU3MzhlMGY3MDAwZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZjZiMWZjMmM5YTI2NDE3OGEzMjY1NzM4ZTBmNzAwMGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuyleyImOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9iMmU1ZDA1YzY0YzU0NjkzOTcyZGQ5ODZiMjA3OGNjNi5zZXRDb250ZW50KGh0bWxfZjZiMWZjMmM5YTI2NDE3OGEzMjY1NzM4ZTBmNzAwMGQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNWM3MWI2YzllOTI5NGUxYzg1MjFlMmM2MDg3N2I4ZDIuYmluZFBvcHVwKHBvcHVwX2IyZTVkMDVjNjRjNTQ2OTM5NzJkZDk4NmIyMDc4Y2M2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NkY2VlMzIzMTk5MDQwMzNhMmY2MzQwM2EwYzgxYjE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjc3MjEwNTkyOTM1MjksIDEyOC40MDg3Mzk4MjMxNzA3Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMThiOTQzNzRhZWViNDVhNTk5NWUxNDMzOWE1NjY3NzIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9jZGNlZTMyMzE5OTA0MDMzYTJmNjM0MDNhMGM4MWIxOS5zZXRJY29uKGljb25fMThiOTQzNzRhZWViNDVhNTk5NWUxNDMzOWE1NjY3NzIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2U4NWU4ZjJkNWM0OTRhOGE4OGMwMTc3MjRlMGNlZjljID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xNTc2YWJmYmZiZDU0YmQ5YjMwOGY1ZTM1NjNmM2ZiNyA9ICQoYDxkaXYgaWQ9Imh0bWxfMTU3NmFiZmJmYmQ1NGJkOWIzMDhmNWUzNTYzZjNmYjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPu2VqOyViOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lODVlOGYyZDVjNDk0YThhODhjMDE3NzI0ZTBjZWY5Yy5zZXRDb250ZW50KGh0bWxfMTU3NmFiZmJmYmQ1NGJkOWIzMDhmNWUzNTYzZjNmYjcpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2RjZWUzMjMxOTkwNDAzM2EyZjYzNDAzYTBjODFiMTkuYmluZFBvcHVwKHBvcHVwX2U4NWU4ZjJkNWM0OTRhOGE4OGMwMTc3MjRlMGNlZjljKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzlhMWI0MDNlMjk4NjRmMzliOTZlZWZlNWVhNjlhMDcwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNDY2NDAxNzY5MzMxNzYsIDEyOC4zMjUzNzg3ODI1MTQzMl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZGZkYmM4YTc0ZGU2NGQ0Mjg0YjkxNDQ2Yjc3ZjUxOGEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl85YTFiNDAzZTI5ODY0ZjM5Yjk2ZWVmZTVlYTY5YTA3MC5zZXRJY29uKGljb25fZGZkYmM4YTc0ZGU2NGQ0Mjg0YjkxNDQ2Yjc3ZjUxOGEpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA5MDhiYjAwM2NkODQ2ZDdiZTkzMjg0NjMyMjc1YzM3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kZjUxNDhlZGUwMTU0NzM5YjhiYWJiOThiZDk0YjUwZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZGY1MTQ4ZWRlMDE1NDczOWI4YmFiYjk4YmQ5NGI1MGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyLoOuwmOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wOTA4YmIwMDNjZDg0NmQ3YmU5MzI4NDYzMjI3NWMzNy5zZXRDb250ZW50KGh0bWxfZGY1MTQ4ZWRlMDE1NDczOWI4YmFiYjk4YmQ5NGI1MGQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOWExYjQwM2UyOTg2NGYzOWI5NmVlZmU1ZWE2OWEwNzAuYmluZFBvcHVwKHBvcHVwXzA5MDhiYjAwM2NkODQ2ZDdiZTkzMjg0NjMyMjc1YzM3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2YwYmM2MDE5ZjQwZjRiODM5ZjQzYjRkMWQ3YzZlOGZiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNDE5Mzk0MDMzMjYzNTksIDEyOC4yODI5MTE4MDA2NzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzc2ZTFkOWU1MzQyYTQyZThiMWVmZjcwMjI1NTRhMTU4ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZjBiYzYwMTlmNDBmNGI4MzlmNDNiNGQxZDdjNmU4ZmIuc2V0SWNvbihpY29uXzc2ZTFkOWU1MzQyYTQyZThiMWVmZjcwMjI1NTRhMTU4KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hMTlmYWEyMjE0MGE0NDFkYTQ1Y2EyOTRmNWUzMzFmZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzlhZjU3NTM5M2I3NDA3ZjlkY2FiYmJhNTlhODc1N2EgPSAkKGA8ZGl2IGlkPSJodG1sX2M5YWY1NzUzOTNiNzQwN2Y5ZGNhYmJiYTU5YTg3NTdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7shqHsgrDsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTE5ZmFhMjIxNDBhNDQxZGE0NWNhMjk0ZjVlMzMxZmUuc2V0Q29udGVudChodG1sX2M5YWY1NzUzOTNiNzQwN2Y5ZGNhYmJiYTU5YTg3NTdhKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2YwYmM2MDE5ZjQwZjRiODM5ZjQzYjRkMWQ3YzZlOGZiLmJpbmRQb3B1cChwb3B1cF9hMTlmYWEyMjE0MGE0NDFkYTQ1Y2EyOTRmNWUzMzFmZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84Zjk1NWE3OTM4Yjc0YmE3YWYwNGVlZGY5MmNjYWE0MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjM4MDU3Njc0NzE4MTY2LCAxMjguMzI0ODc1ODE3Njk5NjVdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzJmYjA2YjE1MTZmZjQ3N2M4MzdmY2MxZTY3MjQwNzFiID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfOGY5NTVhNzkzOGI3NGJhN2FmMDRlZWRmOTJjY2FhNDMuc2V0SWNvbihpY29uXzJmYjA2YjE1MTZmZjQ3N2M4MzdmY2MxZTY3MjQwNzFiKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NzJlYzBlNGY5ZWM0YzNmOTNkMTgwYmFhYTkyMzJkMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOGNlNjA4YmE4N2VhNDg5Y2ExZDMyYzFiZmMyMzA2ZDEgPSAkKGA8ZGl2IGlkPSJodG1sXzhjZTYwOGJhODdlYTQ4OWNhMWQzMmMxYmZjMjMwNmQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7soJXqs6HsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDcyZWMwZTRmOWVjNGMzZjkzZDE4MGJhYWE5MjMyZDIuc2V0Q29udGVudChodG1sXzhjZTYwOGJhODdlYTQ4OWNhMWQzMmMxYmZjMjMwNmQxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzhmOTU1YTc5MzhiNzRiYTdhZjA0ZWVkZjkyY2NhYTQzLmJpbmRQb3B1cChwb3B1cF80NzJlYzBlNGY5ZWM0YzNmOTNkMTgwYmFhYTkyMzJkMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZDhjODBmOGZjZmI0MGNlOGUzOTdkZGU5ZjM1OGY3NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjYxMjgzNzU2NzI3NTQ1NiwgMTI4LjQ3MTIzNDE2ODAyMTk0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8xMTY2ZTcwODkxMmQ0ZDkwYTQ1Y2I2M2VlMDMxMGQwZiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzZkOGM4MGY4ZmNmYjQwY2U4ZTM5N2RkZTlmMzU4Zjc3LnNldEljb24oaWNvbl8xMTY2ZTcwODkxMmQ0ZDkwYTQ1Y2I2M2VlMDMxMGQwZik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTUyMThlOWI0ZDAyNGJhYmI2MGMyYmIwODFjNDJhNjAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY4ZGNiMDhkNjhjNDQ2ZDg4NDMyNTBjNGY5MWZjZDkxID0gJChgPGRpdiBpZD0iaHRtbF82OGRjYjA4ZDY4YzQ0NmQ4ODQzMjUwYzRmOTFmY2Q5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64yA7ZWp7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2E1MjE4ZTliNGQwMjRiYWJiNjBjMmJiMDgxYzQyYTYwLnNldENvbnRlbnQoaHRtbF82OGRjYjA4ZDY4YzQ0NmQ4ODQzMjUwYzRmOTFmY2Q5MSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82ZDhjODBmOGZjZmI0MGNlOGUzOTdkZGU5ZjM1OGY3Ny5iaW5kUG9wdXAocG9wdXBfYTUyMThlOWI0ZDAyNGJhYmI2MGMyYmIwODFjNDJhNjApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNmQ3Y2E3NzNjNzljNDQ2ZTgxYTk1YjBmYzRjZjU2MWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS40MzQzNjMwMjQwOTI0MDYsIDEyOC42MDI4MzU3OTUwMTE4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl85NmM3YmJhNmJiZjg0ZWE3YmJmYjZjYjE0MjcxY2Q3YyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzZkN2NhNzczYzc5YzQ0NmU4MWE5NWIwZmM0Y2Y1NjFkLnNldEljb24oaWNvbl85NmM3YmJhNmJiZjg0ZWE3YmJmYjZjYjE0MjcxY2Q3Yyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTIwODRhYzUxNGExNGZjOTk1YjUxNTAyOTI1OGMxNjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2MwNzU2NDEwMmVhMTQwOGM4ZTIzOTA4NDViNDRlMmJjID0gJChgPGRpdiBpZD0iaHRtbF9jMDc1NjQxMDJlYTE0MDhjOGUyMzkwODQ1YjQ0ZTJiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+67aA6rOh7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzEyMDg0YWM1MTRhMTRmYzk5NWI1MTUwMjkyNThjMTY3LnNldENvbnRlbnQoaHRtbF9jMDc1NjQxMDJlYTE0MDhjOGUyMzkwODQ1YjQ0ZTJiYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82ZDdjYTc3M2M3OWM0NDZlODFhOTViMGZjNGNmNTYxZC5iaW5kUG9wdXAocG9wdXBfMTIwODRhYzUxNGExNGZjOTk1YjUxNTAyOTI1OGMxNjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYTQyOGExYTVhMWYwNGU4OTlhNWY2MDgxMWRmNWU3Y2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xMTg3NDQyNDY3MDU1MSwgMTI4LjU4MDU1NjU4OTM3NDRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2Q4YzRkNmExOGI5ZDRmZTM5ODJjZGU3MTcyMGVjM2Y5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYTQyOGExYTVhMWYwNGU4OTlhNWY2MDgxMWRmNWU3Y2Euc2V0SWNvbihpY29uX2Q4YzRkNmExOGI5ZDRmZTM5ODJjZGU3MTcyMGVjM2Y5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82ZjRlNjc0N2Q1YTk0MmFhYWUwNmU3ODVkMzM4YmQ1NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNmZhZTg1NDBhODczNGE2YjlhZTgyNTQ1NmJmNDU2ZjggPSAkKGA8ZGl2IGlkPSJodG1sXzZmYWU4NTQwYTg3MzRhNmI5YWU4MjU0NTZiZjQ1NmY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7siJjsoJXsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmY0ZTY3NDdkNWE5NDJhYWFlMDZlNzg1ZDMzOGJkNTcuc2V0Q29udGVudChodG1sXzZmYWU4NTQwYTg3MzRhNmI5YWU4MjU0NTZiZjQ1NmY4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E0MjhhMWE1YTFmMDRlODk5YTVmNjA4MTFkZjVlN2NhLmJpbmRQb3B1cChwb3B1cF82ZjRlNjc0N2Q1YTk0MmFhYWUwNmU3ODVkMzM4YmQ1NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YzIzMzRmYWNmNjM0ZmYxOTA1YWEzMjQ5N2Q0MTcyZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIxNzI4Mzc3MjAxOTUwNiwgMTI4LjU4MTI4MzI1NzQ2NDg2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl85MGNiMzAxMjRkNmE0OTdhYjFlNTg5MDBiYjQ3Nzk5MyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzVjMjMzNGZhY2Y2MzRmZjE5MDVhYTMyNDk3ZDQxNzJlLnNldEljb24oaWNvbl85MGNiMzAxMjRkNmE0OTdhYjFlNTg5MDBiYjQ3Nzk5Myk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjNhMmUwNDllOTVjNDQwZWJjZjM2NTNlMDIwYzhhOGQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2E3NjZjY2VjYzNmOTRjODVhZmQ1YzI3ZTZlNzdjMzFiID0gJChgPGRpdiBpZD0iaHRtbF9hNzY2Y2NlY2MzZjk0Yzg1YWZkNWMyN2U2ZTc3YzMxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7IKw7Zi47KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzYzYTJlMDQ5ZTk1YzQ0MGViY2YzNjUzZTAyMGM4YThkLnNldENvbnRlbnQoaHRtbF9hNzY2Y2NlY2MzZjk0Yzg1YWZkNWMyN2U2ZTc3YzMxYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81YzIzMzRmYWNmNjM0ZmYxOTA1YWEzMjQ5N2Q0MTcyZS5iaW5kUG9wdXAocG9wdXBfNjNhMmUwNDllOTVjNDQwZWJjZjM2NTNlMDIwYzhhOGQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjU2ODZkYWE5YjI1NDVmNDllYWMyODJmYzYwNmI4ZDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMDc2MDg0NzY2MDIxMDQsIDEyOC41ODQwMTIwOTA2OTE2M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNTE2NWRhM2IzZjNmNDJiMjk4OWJlZDBjOTlhMjBhNWYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl82NTY4NmRhYTliMjU0NWY0OWVhYzI4MmZjNjA2YjhkOS5zZXRJY29uKGljb25fNTE2NWRhM2IzZjNmNDJiMjk4OWJlZDBjOTlhMjBhNWYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M3Y2EyODRkM2YzZjRkM2Q5NTRiZDBiOWI0NjQyNzk2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xZmFmMGQ2MGY1Y2I0MGU1ODJkYzdmOTRmZmM1NzdlYyA9ICQoYDxkaXYgaWQ9Imh0bWxfMWZhZjBkNjBmNWNiNDBlNTgyZGM3Zjk0ZmZjNTc3ZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyYpOuPmeuPmeygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jN2NhMjg0ZDNmM2Y0ZDNkOTU0YmQwYjliNDY0Mjc5Ni5zZXRDb250ZW50KGh0bWxfMWZhZjBkNjBmNWNiNDBlNTgyZGM3Zjk0ZmZjNTc3ZWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjU2ODZkYWE5YjI1NDVmNDllYWMyODJmYzYwNmI4ZDkuYmluZFBvcHVwKHBvcHVwX2M3Y2EyODRkM2YzZjRkM2Q5NTRiZDBiOWI0NjQyNzk2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzU3OTQ0YWJhZGI1ZjRkNmI4N2E5ODNiNDBkZDJhYmZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjI2Njg4MTMwOTYxNTgsIDEyOC42Nzc3MzU3MDMwODc1Nl0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMmJkY2I2ZTE5NTUzNGYxOGEyMjZhN2M4YWE2MGYyYmQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl81Nzk0NGFiYWRiNWY0ZDZiODdhOTgzYjQwZGQyYWJmZC5zZXRJY29uKGljb25fMmJkY2I2ZTE5NTUzNGYxOGEyMjZhN2M4YWE2MGYyYmQpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBiNjIyOGEyN2E2MTQwOWFhNDZlNTYwYjRhMDNjYWIxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lMzMwNGVjMTc0NmM0NTBmOWM3NWNiY2E2ZDY4M2FhNSA9ICQoYDxkaXYgaWQ9Imh0bWxfZTMzMDRlYzE3NDZjNDUwZjljNzVjYmNhNmQ2ODNhYTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuykkeyVmeygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wYjYyMjhhMjdhNjE0MDlhYTQ2ZTU2MGI0YTAzY2FiMS5zZXRDb250ZW50KGh0bWxfZTMzMDRlYzE3NDZjNDUwZjljNzVjYmNhNmQ2ODNhYTUpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNTc5NDRhYmFkYjVmNGQ2Yjg3YTk4M2I0MGRkMmFiZmQuYmluZFBvcHVwKHBvcHVwXzBiNjIyOGEyN2E2MTQwOWFhNDZlNTYwYjRhMDNjYWIxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzgxYWRmODU4MzUyZjQzZThhODdkNDZlNTU0NzZjZTdlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMTgwNDgyODUxMzc1OTM1LCAxMjguNTU3NzY0MDE0NDkyMTZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzk3ZTc3OTAyOWMxMTQwZDU4NzI2OTlhYjBmYzQ2YTcwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfODFhZGY4NTgzNTJmNDNlOGE4N2Q0NmU1NTQ3NmNlN2Uuc2V0SWNvbihpY29uXzk3ZTc3OTAyOWMxMTQwZDU4NzI2OTlhYjBmYzQ2YTcwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84YzMyOGFjMWU5YTU0ZmFkOWNlMTcxMzhhNWUzNDk4YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfN2Q3MzQ3OWY3MmY5NGNmZDk3MTIwNDBhODgxMjNjNzYgPSAkKGA8ZGl2IGlkPSJodG1sXzdkNzM0NzlmNzJmOTRjZmQ5NzEyMDQwYTg4MTIzYzc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7qsr3rjIDsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOGMzMjhhYzFlOWE1NGZhZDljZTE3MTM4YTVlMzQ5OGIuc2V0Q29udGVudChodG1sXzdkNzM0NzlmNzJmOTRjZmQ5NzEyMDQwYTg4MTIzYzc2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzgxYWRmODU4MzUyZjQzZThhODdkNDZlNTU0NzZjZTdlLmJpbmRQb3B1cChwb3B1cF84YzMyOGFjMWU5YTU0ZmFkOWNlMTcxMzhhNWUzNDk4YikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl81YjA4MTliZThiMjc0YjJhOWIxY2JiMjNjOWUzNjQ0ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjE3NTExODMxNTgyODEyLCAxMjguNTU4MDY5OTcyMzU4ODJdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzA5ZWYxY2NlYzFiNTQ3Nzc5MTg0YzQ3MjA4MDlkZjIxID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNWIwODE5YmU4YjI3NGIyYTliMWNiYjIzYzllMzY0NGQuc2V0SWNvbihpY29uXzA5ZWYxY2NlYzFiNTQ3Nzc5MTg0YzQ3MjA4MDlkZjIxKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iYjEyZmU5ZTVmYjI0ZjhiYWIwZDUxYzYxZDEyYWE1ZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDZmMzcxNTA5ZThhNDJkMDlmZDc2ZjdkZmZhZGY0NzkgPSAkKGA8ZGl2IGlkPSJodG1sXzQ2ZjM3MTUwOWU4YTQyZDA5ZmQ3NmY3ZGZmYWRmNDc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sm5TsmIEy7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JiMTJmZTllNWZiMjRmOGJhYjBkNTFjNjFkMTJhYTVkLnNldENvbnRlbnQoaHRtbF80NmYzNzE1MDllOGE0MmQwOWZkNzZmN2RmZmFkZjQ3OSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl81YjA4MTliZThiMjc0YjJhOWIxY2JiMjNjOWUzNjQ0ZC5iaW5kUG9wdXAocG9wdXBfYmIxMmZlOWU1ZmIyNGY4YmFiMGQ1MWM2MWQxMmFhNWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjc1ZGRlNzVmMzVhNGU5NTg2NmNiZDRhODY3NTcxNTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4xNzc1MzM3NTg4MjIzNTYsIDEyOC41NjMzNzYxMDg0NjA5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9kZjJiYWZhYzkwNzA0Y2YxYTA3NzRkMWI2YjU0NmMyMyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzY3NWRkZTc1ZjM1YTRlOTU4NjZjYmQ0YTg2NzU3MTU4LnNldEljb24oaWNvbl9kZjJiYWZhYzkwNzA0Y2YxYTA3NzRkMWI2YjU0NmMyMyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTQ5ZWM1YmU5MDhhNGQ4N2FhYzM1N2E4YzkxM2MzYzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzg2OTc1MTRkZmQ0ZTQ0MGZhNGNiMGM0ZjllMzM1NzI1ID0gJChgPGRpdiBpZD0iaHRtbF84Njk3NTE0ZGZkNGU0NDBmYTRjYjBjNGY5ZTMzNTcyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7JuU7JiB7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2E0OWVjNWJlOTA4YTRkODdhYWMzNTdhOGM5MTNjM2M0LnNldENvbnRlbnQoaHRtbF84Njk3NTE0ZGZkNGU0NDBmYTRjYjBjNGY5ZTMzNTcyNSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82NzVkZGU3NWYzNWE0ZTk1ODY2Y2JkNGE4Njc1NzE1OC5iaW5kUG9wdXAocG9wdXBfYTQ5ZWM1YmU5MDhhNGQ4N2FhYzM1N2E4YzkxM2MzYzQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2NlYTAyZmQ0ZjU0NDhhMjk4OTkyOWQ3MDY4ODY3NzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMjczOTQyMTA2NjgzODYsIDEyOC42OTIwMTA4MjIwNDU1Ml0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMWVkMDc5NzFiN2RhNDRkMjk1OTIxNmM4MmZjMDNmMjAgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl83Y2VhMDJmZDRmNTQ0OGEyOTg5OTI5ZDcwNjg4Njc3NC5zZXRJY29uKGljb25fMWVkMDc5NzFiN2RhNDRkMjk1OTIxNmM4MmZjMDNmMjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2Y1NjVmMjY0ZDgwYTQ4YWNhZDQ1Njk5YjE2MmIyZjc0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81ZDk3NmM1YmVmNjU0YWI4YWQ5ZWQzODkxY2VhMGVhNCA9ICQoYDxkaXYgaWQ9Imh0bWxfNWQ5NzZjNWJlZjY1NGFiOGFkOWVkMzg5MWNlYTBlYTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyaqe2YuOuhr+uNsOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mNTY1ZjI2NGQ4MGE0OGFjYWQ0NTY5OWIxNjJiMmY3NC5zZXRDb250ZW50KGh0bWxfNWQ5NzZjNWJlZjY1NGFiOGFkOWVkMzg5MWNlYTBlYTQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfN2NlYTAyZmQ0ZjU0NDhhMjk4OTkyOWQ3MDY4ODY3NzQuYmluZFBvcHVwKHBvcHVwX2Y1NjVmMjY0ZDgwYTQ4YWNhZDQ1Njk5YjE2MmIyZjc0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzgxMjZiMjMwZjk3NzRhMjk5OWE5ZTA2ZDAyMzczZjUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMTk3MDg0NzY2NzY4OTc0LCAxMjguNTY0MTE1MjIwMDYzNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fZGZjZTY2YzVkNzQwNDllMmFlYzk0Y2I3MjU3MDk5ZGEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl84MTI2YjIzMGY5Nzc0YTI5OTlhOWUwNmQwMjM3M2Y1My5zZXRJY29uKGljb25fZGZjZTY2YzVkNzQwNDllMmFlYzk0Y2I3MjU3MDk5ZGEpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2ZkNzQ3ZmM0ZTQ0MzQzNjhiYTExZTBiOTc5NzRmMDI4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lOTJiNTc3ZjM3ZWE0YzdlYTJkYjZjNTJjNjg2NzM4NCA9ICQoYDxkaXYgaWQ9Imh0bWxfZTkyYjU3N2YzN2VhNGM3ZWEyZGI2YzUyYzY4NjczODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyZhOyblOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mZDc0N2ZjNGU0NDM0MzY4YmExMWUwYjk3OTc0ZjAyOC5zZXRDb250ZW50KGh0bWxfZTkyYjU3N2YzN2VhNGM3ZWEyZGI2YzUyYzY4NjczODQpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfODEyNmIyMzBmOTc3NGEyOTk5YTllMDZkMDIzNzNmNTMuYmluZFBvcHVwKHBvcHVwX2ZkNzQ3ZmM0ZTQ0MzQzNjhiYTExZTBiOTc5NzRmMDI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2M5MDdjNDE5MTk0YjQ5ZjM4ZGI2YzUzYTk3YjRiMWI1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMTk3MDg0NzY2NzY4OTc0LCAxMjguNTY0MTE1MjIwMDYzNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYjIxMjA0NDc1OWIwNDRlMWE1MjJmNmQ0NmUwODQ2MjMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9jOTA3YzQxOTE5NGI0OWYzOGRiNmM1M2E5N2I0YjFiNS5zZXRJY29uKGljb25fYjIxMjA0NDc1OWIwNDRlMWE1MjJmNmQ0NmUwODQ2MjMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA5NjE5NjlhNjAyZjQwNWRhYmM2YTE2MDY4MWIzMGE1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xNDUxYWEwYTY3MmU0ZWZlYTdhMTE0M2YwOTNlMzYzYyA9ICQoYDxkaXYgaWQ9Imh0bWxfMTQ1MWFhMGE2NzJlNGVmZWE3YTExNDNmMDkzZTM2M2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyepeq1sOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wOTYxOTY5YTYwMmY0MDVkYWJjNmExNjA2ODFiMzBhNS5zZXRDb250ZW50KGh0bWxfMTQ1MWFhMGE2NzJlNGVmZWE3YTExNDNmMDkzZTM2M2MpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYzkwN2M0MTkxOTRiNDlmMzhkYjZjNTNhOTdiNGIxYjUuYmluZFBvcHVwKHBvcHVwXzA5NjE5NjlhNjAyZjQwNWRhYmM2YTE2MDY4MWIzMGE1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzk2YzI4OGIzNzU3YjQyNjQ4NzEwNGY1ZjdhZjY1OTg5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjAzMTE1NjQyNjQ0MDE1LCAxMjguNTY2MDg0MzE5NzQwMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fOTE5ODAwOWQzM2ViNGFjNTg4MTQ2OGVhNDA4YWQ1YzEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl85NmMyODhiMzc1N2I0MjY0ODcxMDRmNWY3YWY2NTk4OS5zZXRJY29uKGljb25fOTE5ODAwOWQzM2ViNGFjNTg4MTQ2OGVhNDA4YWQ1YzEpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg4YWM0MTFiOWFlZjQyYjlhZGQxYjI0NzM4NDVlODUyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMWMwOTE1YThhMTM0NTM4ODNhNTJjNDc5ZjgwMjQ5YyA9ICQoYDxkaXYgaWQ9Imh0bWxfMjFjMDkxNWE4YTEzNDUzODgzYTUyYzQ3OWY4MDI0OWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyekOyCsOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84OGFjNDExYjlhZWY0MmI5YWRkMWIyNDczODQ1ZTg1Mi5zZXRDb250ZW50KGh0bWxfMjFjMDkxNWE4YTEzNDUzODgzYTUyYzQ3OWY4MDI0OWMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfOTZjMjg4YjM3NTdiNDI2NDg3MTA0ZjVmN2FmNjU5ODkuYmluZFBvcHVwKHBvcHVwXzg4YWM0MTFiOWFlZjQyYjlhZGQxYjI0NzM4NDVlODUyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2I2NGMzYzMyZmMwNTRmYmU5ZjVkMThhNzI2YjBlNTEyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjExMDA1ODYyNDExNTMsIDEyOC41NjY0NDIzMDU1NTA5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8xNmM0ZDY2YmE4MTc0MzljYTQxNTRkODc1N2I2ZTY4NyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2I2NGMzYzMyZmMwNTRmYmU5ZjVkMThhNzI2YjBlNTEyLnNldEljb24oaWNvbl8xNmM0ZDY2YmE4MTc0MzljYTQxNTRkODc1N2I2ZTY4Nyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfY2VkY2Q2ZWU1ZDMyNDZlMDhhYTZhNjM4ZWFlYzE1YWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzhlODZkOTI4NDUwNjQ5MDZiOTJkY2IxMWJlNTI1Zjk3ID0gJChgPGRpdiBpZD0iaHRtbF84ZTg2ZDkyODQ1MDY0OTA2YjkyZGNiMTFiZTUyNWY5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7ZqM7JuQwrfqtZDrsKnsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2VkY2Q2ZWU1ZDMyNDZlMDhhYTZhNjM4ZWFlYzE1YWUuc2V0Q29udGVudChodG1sXzhlODZkOTI4NDUwNjQ5MDZiOTJkY2IxMWJlNTI1Zjk3KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2I2NGMzYzMyZmMwNTRmYmU5ZjVkMThhNzI2YjBlNTEyLmJpbmRQb3B1cChwb3B1cF9jZWRjZDZlZTVkMzI0NmUwOGFhNmE2MzhlYWVjMTVhZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZjUxYmQxNDgyYmQ0NzU5OTlmNWNkMzdlZDg1OWQxMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI2NzI4NzgyMjc5NjYyNSwgMTI4LjUyMzQwNzEzNTUwNDQ3XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8zMTk5NTY4NzlkNDI0MTBkODZjOTExMGZmMmMyZjA3NCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzFmNTFiZDE0ODJiZDQ3NTk5OWY1Y2QzN2VkODU5ZDExLnNldEljb24oaWNvbl8zMTk5NTY4NzlkNDI0MTBkODZjOTExMGZmMmMyZjA3NCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjZmYjk5MThmMDg3NGUxODg5ODRhZmYyZmRiMTNhNzYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Q4MTA0MzJiODRhZjQ2ZjU5ZGE0YjI0Nzk2M2UzOWE2ID0gJChgPGRpdiBpZD0iaHRtbF9kODEwNDMyYjg0YWY0NmY1OWRhNGIyNDc5NjNlMzlhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Zi46rOE7L2U7Jik66Gx7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I2ZmI5OTE4ZjA4NzRlMTg4OTg0YWZmMmZkYjEzYTc2LnNldENvbnRlbnQoaHRtbF9kODEwNDMyYjg0YWY0NmY1OWRhNGIyNDc5NjNlMzlhNik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8xZjUxYmQxNDgyYmQ0NzU5OTlmNWNkMzdlZDg1OWQxMS5iaW5kUG9wdXAocG9wdXBfYjZmYjk5MThmMDg3NGUxODg5ODRhZmYyZmRiMTNhNzYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfZTBhYjdmMzM1ZDFjNGJkOGFkMTE4NjU2MmEwYTA1MzYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yNTA2NTQ3MDg1NTcwNiwgMTI4LjUyMjUzNzcxNjY4MjFdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2M0NGM3OTYyYTkwYzRjNDE5NzJkNDM4MWY1ZDg5YmM3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTBhYjdmMzM1ZDFjNGJkOGFkMTE4NjU2MmEwYTA1MzYuc2V0SWNvbihpY29uX2M0NGM3OTYyYTkwYzRjNDE5NzJkNDM4MWY1ZDg5YmM3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wMzJiMjkyYmM0YTc0YzRkOWI1YzFjNGE1ZDFjZmNiZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZmJhYmJjYzFjNmE1NDUwMWI5N2Q2YjQ4YTkzNThiYjYgPSAkKGA8ZGl2IGlkPSJodG1sX2ZiYWJiY2MxYzZhNTQ1MDFiOTdkNmI0OGE5MzU4YmI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7spJHrpqzsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDMyYjI5MmJjNGE3NGM0ZDliNWMxYzRhNWQxY2ZjYmUuc2V0Q29udGVudChodG1sX2ZiYWJiY2MxYzZhNTQ1MDFiOTdkNmI0OGE5MzU4YmI2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2UwYWI3ZjMzNWQxYzRiZDhhZDExODY1NjJhMGEwNTM2LmJpbmRQb3B1cChwb3B1cF8wMzJiMjkyYmM0YTc0YzRkOWI1YzFjNGE1ZDFjZmNiZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9hODI3M2U2YTQ4OWI0YzkwYmVkMTlmYjUwNGU3YWYwOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIzMjQxODMzNTc3MTI1LCAxMjguNDk4NDc1MzgwMjc2MDZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzI3NWE4ZWNlMTE3MTQ4OTA5NTYzNWE3M2I4MzlkYzQwID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYTgyNzNlNmE0ODliNGM5MGJlZDE5ZmI1MDRlN2FmMDkuc2V0SWNvbihpY29uXzI3NWE4ZWNlMTE3MTQ4OTA5NTYzNWE3M2I4MzlkYzQwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81NGFiNWM3ZTA1Yzc0YzQ2OGVhNTg4MjdmMTM1YzA1YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTdiYjQzYTg0MzJlNDVkODlmNWRmM2FkZjhlNjZmYjEgPSAkKGA8ZGl2IGlkPSJodG1sXzk3YmI0M2E4NDMyZTQ1ZDg5ZjVkZjNhZGY4ZTY2ZmIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sgrzqs4TsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTRhYjVjN2UwNWM3NGM0NjhlYTU4ODI3ZjEzNWMwNWMuc2V0Q29udGVudChodG1sXzk3YmI0M2E4NDMyZTQ1ZDg5ZjVkZjNhZGY4ZTY2ZmIxKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2E4MjczZTZhNDg5YjRjOTBiZWQxOWZiNTA0ZTdhZjA5LmJpbmRQb3B1cChwb3B1cF81NGFiNWM3ZTA1Yzc0YzQ2OGVhNTg4MjdmMTM1YzA1YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83ZGQ5MDk1MmJlOTM0OTA0ODUwZmQ3MzkyNTI0ZmRhZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI0MzAzMzAxODg4MDkzLCAxMjguNTAzMjg0NjMyOTg4MTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzQ5ZGYxOTU5NzU1MzRjYWNiZGU4NjBkYTkxYzRlMGExID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfN2RkOTA5NTJiZTkzNDkwNDg1MGZkNzM5MjUyNGZkYWYuc2V0SWNvbihpY29uXzQ5ZGYxOTU5NzU1MzRjYWNiZGU4NjBkYTkxYzRlMGExKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yYWRiNzc2ZDJiMzI0NzhkYmI2NTk2NmUyNDZkMDQ4ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2QyMWZlNTM3ZTdjNDI4NWE3YzI1NjZhYjUxOTJiZjkgPSAkKGA8ZGl2IGlkPSJodG1sXzNkMjFmZTUzN2U3YzQyODVhN2MyNTY2YWI1MTkyYmY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sg4Hqs6HsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmFkYjc3NmQyYjMyNDc4ZGJiNjU5NjZlMjQ2ZDA0OGYuc2V0Q29udGVudChodG1sXzNkMjFmZTUzN2U3YzQyODVhN2MyNTY2YWI1MTkyYmY5KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzdkZDkwOTUyYmU5MzQ5MDQ4NTBmZDczOTI1MjRmZGFmLmJpbmRQb3B1cChwb3B1cF8yYWRiNzc2ZDJiMzI0NzhkYmI2NTk2NmUyNDZkMDQ4ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8zMjYwODFkNzM3OTI0YzgwOTZhNjViODY0MTkyOWZmNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI0NzQxMTUwNjA1MTk5LCAxMjguNTkwNTMzOTU1OTQyNzNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzk2NTRlODI1N2I0MTRlYjVhYmMwY2ZjYjRhMGY1Mzg5ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMzI2MDgxZDczNzkyNGM4MDk2YTY1Yjg2NDE5MjlmZjcuc2V0SWNvbihpY29uXzk2NTRlODI1N2I0MTRlYjVhYmMwY2ZjYjRhMGY1Mzg5KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lZGE4ODZkNDAwY2E0YzZlODhhNzViOGNkMWE3Y2MwMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTQ1Y2ZiNmZlNzA1NGRmZTg4YzNlMzZkZGFjYTk1YmMgPSAkKGA8ZGl2IGlkPSJodG1sX2U0NWNmYjZmZTcwNTRkZmU4OGMzZTM2ZGRhY2E5NWJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rjZXsnqzsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWRhODg2ZDQwMGNhNGM2ZTg4YTc1YjhjZDFhN2NjMDEuc2V0Q29udGVudChodG1sX2U0NWNmYjZmZTcwNTRkZmU4OGMzZTM2ZGRhY2E5NWJjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzMyNjA4MWQ3Mzc5MjRjODA5NmE2NWI4NjQxOTI5ZmY3LmJpbmRQb3B1cChwb3B1cF9lZGE4ODZkNDAwY2E0YzZlODhhNzViOGNkMWE3Y2MwMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNGRiODczNWY4MDA0MzE0OTA1ZjQyODA5NWM1OGJiOCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIzOTQ1MDI2MjgxODY4LCAxMjguNTc4ODE3ODQ4MjA1NzRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzIzM2M0ZTg2YWRiYjRlNDc5M2MyMDM0YWNiZThlNWFhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfYjRkYjg3MzVmODAwNDMxNDkwNWY0MjgwOTVjNThiYjguc2V0SWNvbihpY29uXzIzM2M0ZTg2YWRiYjRlNDc5M2MyMDM0YWNiZThlNWFhKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yOGM0YTlhZjMzYWU0ZTUzYWQxNDM4NDM0OTIzOTg4YiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNjA4YTllNmRhZGY2NDg1MWE5Y2Y3ZTM3ZjdkNDEyYWYgPSAkKGA8ZGl2IGlkPSJodG1sXzYwOGE5ZTZkYWRmNjQ4NTFhOWNmN2UzN2Y3ZDQxMmFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7tlanshLHsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjhjNGE5YWYzM2FlNGU1M2FkMTQzODQzNDkyMzk4OGIuc2V0Q29udGVudChodG1sXzYwOGE5ZTZkYWRmNjQ4NTFhOWNmN2UzN2Y3ZDQxMmFmKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2I0ZGI4NzM1ZjgwMDQzMTQ5MDVmNDI4MDk1YzU4YmI4LmJpbmRQb3B1cChwb3B1cF8yOGM0YTlhZjMzYWU0ZTUzYWQxNDM4NDM0OTIzOTg4YikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZThhZTg1YTUzZDc0ZmQ2ODc3ODk0OGRhZjU1ZTYwZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIzNjE4NzExMzgyNzk2LCAxMjguNTg3Njg3MjUwMDQ1OTddLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2IwZDFmYWU5ZGY4YzQzNWNhZDE2YWRhN2FhYTA3MzI2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfMGU4YWU4NWE1M2Q3NGZkNjg3Nzg5NDhkYWY1NWU2MGQuc2V0SWNvbihpY29uX2IwZDFmYWU5ZGY4YzQzNWNhZDE2YWRhN2FhYTA3MzI2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMjcyYzZjOTZlNDg0NmMyODRkMTA5MWZlZGFiOGUwNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2EwYjg5MDhjODM5NDk2YTliNmZmMzkxNWUxZTEzNDIgPSAkKGA8ZGl2IGlkPSJodG1sXzNhMGI4OTA4YzgzOTQ5NmE5YjZmZjM5MTVlMWUxMzQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rj5nrp4jsgrDsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDI3MmM2Yzk2ZTQ4NDZjMjg0ZDEwOTFmZWRhYjhlMDUuc2V0Q29udGVudChodG1sXzNhMGI4OTA4YzgzOTQ5NmE5YjZmZjM5MTVlMWUxMzQyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzBlOGFlODVhNTNkNzRmZDY4Nzc4OTQ4ZGFmNTVlNjBkLmJpbmRQb3B1cChwb3B1cF9kMjcyYzZjOTZlNDg0NmMyODRkMTA5MWZlZGFiOGUwNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82Njc1OTM3NzEwODY0NzA5YjE5MzBkNDU2YmNkZDdiZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjI1NjQ0MTU4MjA2NDUsIDEyOC41OTk1NzQ5MzA3MjA2NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fOThkOTk1ZTc3NjcxNGYwNGJlYTZjODg0OGJjMzcyMDYgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl82Njc1OTM3NzEwODY0NzA5YjE5MzBkNDU2YmNkZDdiZC5zZXRJY29uKGljb25fOThkOTk1ZTc3NjcxNGYwNGJlYTZjODg0OGJjMzcyMDYpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk0MTFhYTJhZTI5YTQ3MzJhYTQ2NWI5Mjc3NGI0Yjg1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81MjA3MmI5MmI5ODY0Mzc3YjE3N2YzODdkMDAyMzAyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfNTIwNzJiOTJiOTg2NDM3N2IxNzdmMzg3ZDAwMjMwMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyGjOqzhC7qtazslZTsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTQxMWFhMmFlMjlhNDczMmFhNDY1YjkyNzc0YjRiODUuc2V0Q29udGVudChodG1sXzUyMDcyYjkyYjk4NjQzNzdiMTc3ZjM4N2QwMDIzMDI1KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY2NzU5Mzc3MTA4NjQ3MDliMTkzMGQ0NTZiY2RkN2JkLmJpbmRQb3B1cChwb3B1cF85NDExYWEyYWUyOWE0NzMyYWE0NjViOTI3NzRiNGI4NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZjBhMmZjNGFhZDE0NThlODcyNjg3MmJmZTFmY2E5MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIyMjI4Mzc5NDcwOTA2NCwgMTI4LjU5NzIwODUwNjExODE0XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl9jOTZlZjIxMGM4OWI0N2VjYTg1YTkyZWU5MDE3ZDM5MSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzFmMGEyZmM0YWFkMTQ1OGU4NzI2ODcyYmZlMWZjYTkwLnNldEljb24oaWNvbl9jOTZlZjIxMGM4OWI0N2VjYTg1YTkyZWU5MDE3ZDM5MSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMGI5NDNkNTExYzcxNGI3YmI1NmQwY2NhNmFmMTJhYjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzUzODlmODc1MmNkYjQ0NmJhNGVjOTAyZTA3OTc3MzU2ID0gJChgPGRpdiBpZD0iaHRtbF81Mzg5Zjg3NTJjZGI0NDZiYTRlYzkwMmUwNzk3NzM1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+67SJ7JWULuyWkeuNlTHsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGI5NDNkNTExYzcxNGI3YmI1NmQwY2NhNmFmMTJhYjUuc2V0Q29udGVudChodG1sXzUzODlmODc1MmNkYjQ0NmJhNGVjOTAyZTA3OTc3MzU2KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzFmMGEyZmM0YWFkMTQ1OGU4NzI2ODcyYmZlMWZjYTkwLmJpbmRQb3B1cChwb3B1cF8wYjk0M2Q1MTFjNzE0YjdiYjU2ZDBjY2E2YWYxMmFiNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lMmEzYTVkYWM3Nzc0MWRkYmExNmVkOTBmODc4NzZjZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjIzMDY2MDQ0Mzk5MTE5LCAxMjguNTgyMjA2MjU4NzAwNThdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2M4NzgyMjdkMjg3MzQzYTZhNDQ0N2I0MzdhODMyMGNhID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZTJhM2E1ZGFjNzc3NDFkZGJhMTZlZDkwZjg3ODc2Y2Quc2V0SWNvbihpY29uX2M4NzgyMjdkMjg3MzQzYTZhNDQ0N2I0MzdhODMyMGNhKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lMDhmYTcyNmJjMzc0ZjZkYjg0MWMzNjE2OWFiYjNjMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTk2ZjgxMjBhZDcyNDJjNjk1Y2U4YzJmOGMwNmM3ZmYgPSAkKGA8ZGl2IGlkPSJodG1sX2U5NmY4MTIwYWQ3MjQyYzY5NWNlOGMyZjhjMDZjN2ZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7slpHrjZUu7ZWc7J287KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2UwOGZhNzI2YmMzNzRmNmRiODQxYzM2MTY5YWJiM2MyLnNldENvbnRlbnQoaHRtbF9lOTZmODEyMGFkNzI0MmM2OTVjZThjMmY4YzA2YzdmZik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lMmEzYTVkYWM3Nzc0MWRkYmExNmVkOTBmODc4NzZjZC5iaW5kUG9wdXAocG9wdXBfZTA4ZmE3MjZiYzM3NGY2ZGI4NDFjMzYxNjlhYmIzYzIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzM5ZDAwZDE1MTQ4NDljYWE3MTgxMjJiM2M0NGNjMGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMzE1NTgzNDAzMzIsIDEyOC41NjU1NTQ0MzY5NDgyNV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYzIxZmFmYzY2OWRjNGVlNjlmMmJjYjIxNmFhMmQ1ZGEgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8zMzlkMDBkMTUxNDg0OWNhYTcxODEyMmIzYzQ0Y2MwYy5zZXRJY29uKGljb25fYzIxZmFmYzY2OWRjNGVlNjlmMmJjYjIxNmFhMmQ1ZGEpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzRiYjg2MDA3ZDk5ZjQ3YWE5ZTIxMTc2Y2IxOTk1ZjQ3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zNzQ4OWEwNjQ1Y2I0ZWRhOTlmY2U0MWYxYjcyZDFmMCA9ICQoYDxkaXYgaWQ9Imh0bWxfMzc0ODlhMDY0NWNiNGVkYTk5ZmNlNDFmMWI3MmQxZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyEnOuniOyCsO2ajOyEseygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80YmI4NjAwN2Q5OWY0N2FhOWUyMTE3NmNiMTk5NWY0Ny5zZXRDb250ZW50KGh0bWxfMzc0ODlhMDY0NWNiNGVkYTk5ZmNlNDFmMWI3MmQxZjApOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMzM5ZDAwZDE1MTQ4NDljYWE3MTgxMjJiM2M0NGNjMGMuYmluZFBvcHVwKHBvcHVwXzRiYjg2MDA3ZDk5ZjQ3YWE5ZTIxMTc2Y2IxOTk1ZjQ3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NmNThlMGZiNWY5MzRjOWM5NmM4NDEwOTA5MGI3NmExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzk5NzI5NTk4NTYwOTc0LCAxMjguODQxMTEzNTg2NzMzMV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNzRiODI5MjE3MjJhNDhlOTkzNTY0MGVhNmE3YjI5ZmUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9jZjU4ZTBmYjVmOTM0YzljOTZjODQxMDkwOTBiNzZhMS5zZXRJY29uKGljb25fNzRiODI5MjE3MjJhNDhlOTkzNTY0MGVhNmE3YjI5ZmUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkzOGQxYmI0YmYwZDRmZTFhYjU0MTQ0OTViOTBmNTNiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lNDZhY2YyMGUzMDg0YmEyOTU4MjEyY2JiMWJlNzQzMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZTQ2YWNmMjBlMzA4NGJhMjk1ODIxMmNiYjFiZTc0MzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyCvOuekeynhOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85MzhkMWJiNGJmMGQ0ZmUxYWI1NDE0NDk1YjkwZjUzYi5zZXRDb250ZW50KGh0bWxfZTQ2YWNmMjBlMzA4NGJhMjk1ODIxMmNiYjFiZTc0MzEpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfY2Y1OGUwZmI1ZjkzNGM5Yzk2Yzg0MTA5MDkwYjc2YTEuYmluZFBvcHVwKHBvcHVwXzkzOGQxYmI0YmYwZDRmZTFhYjU0MTQ0OTViOTBmNTNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzkzZmQ2YTJhZWNjZDRmYmY5NjQyYjZlNjk0Nzc0YzRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzc0NzE3MjYwNDMwNzY0LCAxMjguNzA5NjA5NzgwNTUyMDNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzY0ZDkxNzEzYTkyNjQxNDA5OTU1NDQyMTVmMDc5NTkyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfOTNmZDZhMmFlY2NkNGZiZjk2NDJiNmU2OTQ3NzRjNGIuc2V0SWNvbihpY29uXzY0ZDkxNzEzYTkyNjQxNDA5OTU1NDQyMTVmMDc5NTkyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xMjA2MDkzYTMzYjc0YWU5ODAxODQ0YWUwN2Q0OGFhMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTMwNzYxZjQyMDQ4NGIwOWExMWQwNTU1YzY3ZmI2ZmMgPSAkKGA8ZGl2IGlkPSJodG1sX2UzMDc2MWY0MjA0ODRiMDlhMTFkMDU1NWM2N2ZiNmZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7siJjsgrDsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTIwNjA5M2EzM2I3NGFlOTgwMTg0NGFlMDdkNDhhYTIuc2V0Q29udGVudChodG1sX2UzMDc2MWY0MjA0ODRiMDlhMTFkMDU1NWM2N2ZiNmZjKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzkzZmQ2YTJhZWNjZDRmYmY5NjQyYjZlNjk0Nzc0YzRiLmJpbmRQb3B1cChwb3B1cF8xMjA2MDkzYTMzYjc0YWU5ODAxODQ0YWUwN2Q0OGFhMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl84OTczOTY3MDg4YTQ0NGQ3YWI0NDk5YzcxMjNmNGI3OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjUxMDg0MjcwMzM2NTkzLCAxMjguNzI5MzU0NDA3NTk4ODZdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2FhNWRlYTVmNTlhMTRkYTFhODMyMjVkODY3OTUxNDM3ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfODk3Mzk2NzA4OGE0NDRkN2FiNDQ5OWM3MTIzZjRiNzguc2V0SWNvbihpY29uX2FhNWRlYTVmNTlhMTRkYTFhODMyMjVkODY3OTUxNDM3KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85MjRhZmEwNTlkNWU0NGIxYWMzOTdlYWFiOWE1OThhMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzJmYWNkZGFlNTJkNDI4OTg2OGQ1ZWIyYWEyNGVjMjggPSAkKGA8ZGl2IGlkPSJodG1sXzcyZmFjZGRhZTUyZDQyODk4NjhkNWViMmFhMjRlYzI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rtoDrtoHsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTI0YWZhMDU5ZDVlNDRiMWFjMzk3ZWFhYjlhNTk4YTMuc2V0Q29udGVudChodG1sXzcyZmFjZGRhZTUyZDQyODk4NjhkNWViMmFhMjRlYzI4KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzg5NzM5NjcwODhhNDQ0ZDdhYjQ0OTljNzEyM2Y0Yjc4LmJpbmRQb3B1cChwb3B1cF85MjRhZmEwNTlkNWU0NGIxYWMzOTdlYWFiOWE1OThhMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl83Mjg0NDU1NGVkMzU0MDcyYTFjMjlhMDBmMDk1ZGVkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjU4NTIwMDA4MjMwMywgMTI4Ljg4MDkyMTA3Njg3NTRdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2Y2NGZlNTYxMzg0ZjRlNDVhNTliNTU3OWQ2NmVjYTQ2ID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNzI4NDQ1NTRlZDM1NDA3MmExYzI5YTAwZjA5NWRlZGYuc2V0SWNvbihpY29uX2Y2NGZlNTYxMzg0ZjRlNDVhNTliNTU3OWQ2NmVjYTQ2KTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85ZmU5YmRhZjE4NDQ0NGE4ODNjYzljYTkxMDA0NWQwOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNGNkNzVkOGE1YjlhNGJiMTg3ZTNjZjlkODQwYjY0NzIgPSAkKGA8ZGl2IGlkPSJodG1sXzRjZDc1ZDhhNWI5YTRiYjE4N2UzY2Y5ZDg0MGI2NDcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7sgrDrgrTsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOWZlOWJkYWYxODQ0NDRhODgzY2M5Y2E5MTAwNDVkMDguc2V0Q29udGVudChodG1sXzRjZDc1ZDhhNWI5YTRiYjE4N2UzY2Y5ZDg0MGI2NDcyKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzcyODQ0NTU0ZWQzNTQwNzJhMWMyOWEwMGYwOTVkZWRmLmJpbmRQb3B1cChwb3B1cF85ZmU5YmRhZjE4NDQ0NGE4ODNjYzljYTkxMDA0NWQwOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl82ODJjMWIzNWY0YjU0Njg3YTM5ODlhYmVlY2ZhYTZiYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjU4Nzc5OTQzOTg1ODA0LCAxMjguOTUyOTM1NjgxNzE4NjNdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uXzg2ZmQzYTFhODk2YjQ0MDZiMjIyZGI2OThlMTI0ZWUyID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfNjgyYzFiMzVmNGI1NDY4N2EzOTg5YWJlZWNmYWE2YmMuc2V0SWNvbihpY29uXzg2ZmQzYTFhODk2YjQ0MDZiMjIyZGI2OThlMTI0ZWUyKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mZWQ0NDdlMGY5YTM0MzVhYjY3ZGJiYTZhYWEzNWM5OCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNmQxMTg2YmMyOTBkNGYzZmEzN2VmNzNhOTEwNzdhZTAgPSAkKGA8ZGl2IGlkPSJodG1sXzZkMTE4NmJjMjkwZDRmM2ZhMzdlZjczYTkxMDc3YWUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7rgqjrqoXsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZmVkNDQ3ZTBmOWEzNDM1YWI2N2RiYmE2YWFhMzVjOTguc2V0Q29udGVudChodG1sXzZkMTE4NmJjMjkwZDRmM2ZhMzdlZjczYTkxMDc3YWUwKTsKICAgICAgICAKCiAgICAgICAgbWFya2VyXzY4MmMxYjM1ZjRiNTQ2ODdhMzk4OWFiZWVjZmFhNmJjLmJpbmRQb3B1cChwb3B1cF9mZWQ0NDdlMGY5YTM0MzVhYjY3ZGJiYTZhYWEzNWM5OCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9mN2E3ODAzNDFmYjI0ZTgxODA0NTNhOWUyZDViYzdlMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjMzODI0NjkyMTMxMjE3LCAxMjkuMDMzODUyOTIxODAzODhdLAogICAgICAgICAgICAgICAge30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfODU5Y2IzZTZkZDk3NDAwZTkxOWU0MGQxNTI1MDNmNGYpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBpY29uX2VjMDY0ZjUwZDcxNjRjOWZiMGVlNmQ2YzcyYmZiYjFlID0gTC5Bd2Vzb21lTWFya2Vycy5pY29uKAogICAgICAgICAgICAgICAgeyJleHRyYUNsYXNzZXMiOiAiZmEtcm90YXRlLTAiLCAiaWNvbiI6ICJnbHlwaGljb24gZ2x5cGhpY29uLWN1dGxlcnkiLCAiaWNvbkNvbG9yIjogIndoaXRlIiwgIm1hcmtlckNvbG9yIjogImxpZ2h0cmVkIiwgInByZWZpeCI6ICJnbHlwaGljb24ifQogICAgICAgICAgICApOwogICAgICAgICAgICBtYXJrZXJfZjdhNzgwMzQxZmIyNGU4MTgwNDUzYTllMmQ1YmM3ZTEuc2V0SWNvbihpY29uX2VjMDY0ZjUwZDcxNjRjOWZiMGVlNmQ2YzcyYmZiYjFlKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMjllYWJjYTMxNjg0MGU5YTNiMGNiOTY5YmI2NTQ1ZSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2EyY2RlNWQxNzhiNDdhNDg0ZDY5ZDdjMDRhMmUxZjQgPSAkKGA8ZGl2IGlkPSJodG1sXzNhMmNkZTVkMTc4YjQ3YTQ4NGQ2OWQ3YzA0YTJlMWY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij7si6Drj4Tsi5zsoJA8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDI5ZWFiY2EzMTY4NDBlOWEzYjBjYjk2OWJiNjU0NWUuc2V0Q29udGVudChodG1sXzNhMmNkZTVkMTc4YjQ3YTQ4NGQ2OWQ3YzA0YTJlMWY0KTsKICAgICAgICAKCiAgICAgICAgbWFya2VyX2Y3YTc4MDM0MWZiMjRlODE4MDQ1M2E5ZTJkNWJjN2UxLmJpbmRQb3B1cChwb3B1cF9kMjllYWJjYTMxNjg0MGU5YTNiMGNiOTY5YmI2NTQ1ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNjEyYzcyNzdlYzQ0Y2FmYTg1OTQ0Y2U0M2VjMTcyMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjQxMDM4OTA5NjMyMDc4NSwgMTI5LjE1OTc5NDE1MDA0OTM1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl81MmY5YmJhZjNiMTk0MWI1YjRiMzhkNjVlODQ5MzJlNyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2U2MTJjNzI3N2VjNDRjYWZhODU5NDRjZTQzZWMxNzIwLnNldEljb24oaWNvbl81MmY5YmJhZjNiMTk0MWI1YjRiMzhkNjVlODQ5MzJlNyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmZkMTQwYTAyMDBkNGEzN2I5YTYxZDFmNDQzMGUzMDMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Q1MDg2ZWE0YjU5MDRhNzhhOGFlZDJkNDAyZmEzODc3ID0gJChgPGRpdiBpZD0iaHRtbF9kNTA4NmVhNGI1OTA0YTc4YThhZWQyZDQwMmZhMzg3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7JuF7IOB7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2JmZDE0MGEwMjAwZDRhMzdiOWE2MWQxZjQ0MzBlMzAzLnNldENvbnRlbnQoaHRtbF9kNTA4NmVhNGI1OTA0YTc4YThhZWQyZDQwMmZhMzg3Nyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9lNjEyYzcyNzdlYzQ0Y2FmYTg1OTQ0Y2U0M2VjMTcyMC5iaW5kUG9wdXAocG9wdXBfYmZkMTQwYTAyMDBkNGEzN2I5YTYxZDFmNDQzMGUzMDMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmIxZjUzMzkyOTg5NDQ1NDhkODdjOTUyODIwMzQyM2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zNDY5MjgwNzAxODMzLCAxMjkuMDM2OTgzMDIyNzI2NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYzgwNzllNDIwMTM1NGJlOWE0YmM0ZmY4OTUxOTdhMGMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9iYjFmNTMzOTI5ODk0NDU0OGQ4N2M5NTI4MjAzNDIzZS5zZXRJY29uKGljb25fYzgwNzllNDIwMTM1NGJlOWE0YmM0ZmY4OTUxOTdhMGMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2RhMmM4YjRkOTNhNzQ3OWI5YWI4OWFkYjAyNGI0ODhhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83NjRkNDUzNjU3ODM0Y2RkODBmMzcyMmFjZWJhMjk0MyA9ICQoYDxkaXYgaWQ9Imh0bWxfNzY0ZDQ1MzY1NzgzNGNkZDgwZjM3MjJhY2ViYTI5NDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuu2geu2gOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kYTJjOGI0ZDkzYTc0NzliOWFiODlhZGIwMjRiNDg4YS5zZXRDb250ZW50KGh0bWxfNzY0ZDQ1MzY1NzgzNGNkZDgwZjM3MjJhY2ViYTI5NDMpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYmIxZjUzMzkyOTg5NDQ1NDhkODdjOTUyODIwMzQyM2UuYmluZFBvcHVwKHBvcHVwX2RhMmM4YjRkOTNhNzQ3OWI5YWI4OWFkYjAyNGI0ODhhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2JmYWQ2ZGM3M2E3MzQwNWRhZjQxMTYwYjQwYWU1NjA0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjM1NDMzNDY5OTc3NTksIDEyOC44NTE3NTA1Mzk0MV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fMmM3NDI2M2M2ODc2NGVhNWFkN2Q3NWJmZGRhNTllNjUgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9iZmFkNmRjNzNhNzM0MDVkYWY0MTE2MGI0MGFlNTYwNC5zZXRJY29uKGljb25fMmM3NDI2M2M2ODc2NGVhNWFkN2Q3NWJmZGRhNTllNjUpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzdiMTIwMDk4ZDU0MzRkNDI5YzhjZmQwZjkyYjJhNmIzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kYzIwODQ4ZWFlNTM0ZDExYWY4NGFkNGFlYzZiNjU1YiA9ICQoYDxkaXYgaWQ9Imh0bWxfZGMyMDg0OGVhZTUzNGQxMWFmODRhZDRhZWM2YjY1NWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyZuOuPmeygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83YjEyMDA5OGQ1NDM0ZDQyOWM4Y2ZkMGY5MmIyYTZiMy5zZXRDb250ZW50KGh0bWxfZGMyMDg0OGVhZTUzNGQxMWFmODRhZDRhZWM2YjY1NWIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYmZhZDZkYzczYTczNDA1ZGFmNDExNjBiNDBhZTU2MDQuYmluZFBvcHVwKHBvcHVwXzdiMTIwMDk4ZDU0MzRkNDI5YzhjZmQwZjkyYjJhNmIzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NlNWRiNGFiNzAzNjRkMGNhZGMwYTc0OTYwNmQxM2VlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjgxNzkyMzk4ODEyMjIsIDEyOC45ODAxNzYyNjI2NjE2XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8wY2M0MzkyYzQ4NGM0MWUyOWE2YjZmYzA4YjI0MWNhZCA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyX2NlNWRiNGFiNzAzNjRkMGNhZGMwYTc0OTYwNmQxM2VlLnNldEljb24oaWNvbl8wY2M0MzkyYzQ4NGM0MWUyOWE2YjZmYzA4YjI0MWNhZCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWZmMWVjZjZkOGFiNGNiYjhlZWRiMDU3MGY5ODNkMmIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzVlMGMxZGMzMWIwNzQ1YmM5NzYzNDE4ODY2NDVlNmJjID0gJChgPGRpdiBpZD0iaHRtbF81ZTBjMWRjMzFiMDc0NWJjOTc2MzQxODg2NjQ1ZTZiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7Jik6rGw66as7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VmZjFlY2Y2ZDhhYjRjYmI4ZWVkYjA1NzBmOTgzZDJiLnNldENvbnRlbnQoaHRtbF81ZTBjMWRjMzFiMDc0NWJjOTc2MzQxODg2NjQ1ZTZiYyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl9jZTVkYjRhYjcwMzY0ZDBjYWRjMGE3NDk2MDZkMTNlZS5iaW5kUG9wdXAocG9wdXBfZWZmMWVjZjZkOGFiNGNiYjhlZWRiMDU3MGY5ODNkMmIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjEzMzRkODZiYTM4NDIyOGI5MWNmYWZlNTEzYTk3YmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yNDgzMjMwNjU0ODYxNiwgMTI4Ljc0ODYxNDYyNTQyNDU4XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl80NmJhZWQyMzE2Mjc0NDQxYTc4NjQ5YTQxNzVlYmM5NiA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzYxMzM0ZDg2YmEzODQyMjhiOTFjZmFmZTUxM2E5N2JjLnNldEljb24oaWNvbl80NmJhZWQyMzE2Mjc0NDQxYTc4NjQ5YTQxNzVlYmM5Nik7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTZlYTZjNDE3M2E4NDhiYzk0ZmZjMWE5OWJlZTMwZGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzhiZmYwYmQ3ZjY5MTRhY2NhOWMzZDM0YWFjZDAwM2Y3ID0gJChgPGRpdiBpZD0iaHRtbF84YmZmMGJkN2Y2OTE0YWNjYTljM2QzNGFhY2QwMDNmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7KeE66GA7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk2ZWE2YzQxNzNhODQ4YmM5NGZmYzFhOTliZWUzMGRlLnNldENvbnRlbnQoaHRtbF84YmZmMGJkN2Y2OTE0YWNjYTljM2QzNGFhY2QwMDNmNyk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82MTMzNGQ4NmJhMzg0MjI4YjkxY2ZhZmU1MTNhOTdiYy5iaW5kUG9wdXAocG9wdXBfOTZlYTZjNDE3M2E4NDhiYzk0ZmZjMWE5OWJlZTMwZGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjEyZDcwZmJlZmZmNDUwZWE3ODAzNDM2YmVlNDk5ZWEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4zMjExMjU2OTIzMTAwMSwgMTI4Ljc2NTcyMDIzNTM0ODY1XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl8wNjk1OTViMjhmNzY0ZmUzODIzOGQwNWQ1YzAwMDE3YSA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzYxMmQ3MGZiZWZmZjQ1MGVhNzgwMzQzNmJlZTQ5OWVhLnNldEljb24oaWNvbl8wNjk1OTViMjhmNzY0ZmUzODIzOGQwNWQ1YzAwMDE3YSk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmMxOWExM2EzOTkzNDQ1ZWFlMWZiNmI4NTc3NThkMjEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2ZkMjU1ZWI2MjBiNTQ3NThhNWZmNDlmYjE3MWNkOTJhID0gJChgPGRpdiBpZD0iaHRtbF9mZDI1NWViNjIwYjU0NzU4YTVmZjQ5ZmIxNzFjZDkyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+7ZWc66a87KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJjMTlhMTNhMzk5MzQ0NWVhZTFmYjZiODU3NzU4ZDIxLnNldENvbnRlbnQoaHRtbF9mZDI1NWViNjIwYjU0NzU4YTVmZjQ5ZmIxNzFjZDkyYSk7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl82MTJkNzBmYmVmZmY0NTBlYTc4MDM0MzZiZWU0OTllYS5iaW5kUG9wdXAocG9wdXBfMmMxOWExM2EzOTkzNDQ1ZWFlMWZiNmI4NTc3NThkMjEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjU0NDE2YTBjYmJjNDU5NThkODBkNDU2N2FiZjg1OWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yMDA3MTE4NDI0MDc0ODYsIDEyOC44MTUzNzEzMzM1NzI3M10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fYzRmNDIwZDA4OThlNDI3NTgxNzgxNDkzM2VlYzIyMTQgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl9iNTQ0MTZhMGNiYmM0NTk1OGQ4MGQ0NTY3YWJmODU5ZC5zZXRJY29uKGljb25fYzRmNDIwZDA4OThlNDI3NTgxNzgxNDkzM2VlYzIyMTQpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzVlMTMyMjA3OTdlMzQ1MTk5YTMyYWY3MDc1NDBiMTNhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMTVjNzc1OGUyZmU0NTQzOTU2OWJmMmFiMjZjNGU3OCA9ICQoYDxkaXYgaWQ9Imh0bWxfMjE1Yzc3NThlMmZlNDU0Mzk1NjliZjJhYjI2YzRlNzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuyepeycoOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF81ZTEzMjIwNzk3ZTM0NTE5OWEzMmFmNzA3NTQwYjEzYS5zZXRDb250ZW50KGh0bWxfMjE1Yzc3NThlMmZlNDU0Mzk1NjliZjJhYjI2YzRlNzgpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfYjU0NDE2YTBjYmJjNDU5NThkODBkNDU2N2FiZjg1OWQuYmluZFBvcHVwKHBvcHVwXzVlMTMyMjA3OTdlMzQ1MTk5YTMyYWY3MDc1NDBiMTNhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzYyODhmNTdjY2MwODQ4YWE4ODQ5ZjA5OGUzMGRjM2NjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMzAyNTg0OTkxMTAyNDksIDEyOC43Mzc2OTc4MzI4MTA4NV0sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNDJlOTllOTlhMDE4NDZkOGI5NWIzZThhMGE1MWQ5NjIgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl82Mjg4ZjU3Y2NjMDg0OGFhODg0OWYwOThlMzBkYzNjYy5zZXRJY29uKGljb25fNDJlOTllOTlhMDE4NDZkOGI5NWIzZThhMGE1MWQ5NjIpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2EyNTRjZWYxNWEwYjQ4ZmZhNWIwZmIxODY3Njc4ZGU0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9iOTUyNmRiOGFjODY0ODliODExNmVkZDMyZTQ2M2ZmYiA9ICQoYDxkaXYgaWQ9Imh0bWxfYjk1MjZkYjhhYzg2NDg5YjgxMTZlZGQzMmU0NjNmZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuynhOyYgeygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hMjU0Y2VmMTVhMGI0OGZmYTViMGZiMTg2NzY3OGRlNC5zZXRDb250ZW50KGh0bWxfYjk1MjZkYjhhYzg2NDg5YjgxMTZlZGQzMmU0NjNmZmIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfNjI4OGY1N2NjYzA4NDhhYTg4NDlmMDk4ZTMwZGMzY2MuYmluZFBvcHVwKHBvcHVwX2EyNTRjZWYxNWEwYjQ4ZmZhNWIwZmIxODY3Njc4ZGU0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzBlYjA5ZjIyMWEwMDQ4ZTY4YWJmYzM1MjI1ZjBiYzIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjMwMzUyMTI0MzkxOTIsIDEyOC45MjM3NTUwMjA3NjMxN10sCiAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICApLmFkZFRvKG1hcF84NTljYjNlNmRkOTc0MDBlOTE5ZTQwZDE1MjUwM2Y0Zik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGljb25fNDhmOGU5NTFmYWQ3NDAzNWI4OGQxODQyNzY3ZWIwNjMgPSBMLkF3ZXNvbWVNYXJrZXJzLmljb24oCiAgICAgICAgICAgICAgICB7ImV4dHJhQ2xhc3NlcyI6ICJmYS1yb3RhdGUtMCIsICJpY29uIjogImdseXBoaWNvbiBnbHlwaGljb24tY3V0bGVyeSIsICJpY29uQ29sb3IiOiAid2hpdGUiLCAibWFya2VyQ29sb3IiOiAibGlnaHRyZWQiLCAicHJlZml4IjogImdseXBoaWNvbiJ9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG1hcmtlcl8wZWIwOWYyMjFhMDA0OGU2OGFiZmMzNTIyNWYwYmMyMS5zZXRJY29uKGljb25fNDhmOGU5NTFmYWQ3NDAzNWI4OGQxODQyNzY3ZWIwNjMpOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc2ODI5MDllMTBjYjQ3YjRiZmRjYzdjN2YwNzJiYjJlID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lN2FkOTI0YWUyNjQ0OTZiYTc2YzcwMDQxNDhhYmM0YiA9ICQoYDxkaXYgaWQ9Imh0bWxfZTdhZDkyNGFlMjY0NDk2YmE3NmM3MDA0MTQ4YWJjNGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPuuPmeq5gO2VtOygkDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83NjgyOTA5ZTEwY2I0N2I0YmZkY2M3YzdmMDcyYmIyZS5zZXRDb250ZW50KGh0bWxfZTdhZDkyNGFlMjY0NDk2YmE3NmM3MDA0MTQ4YWJjNGIpOwogICAgICAgIAoKICAgICAgICBtYXJrZXJfMGViMDlmMjIxYTAwNDhlNjhhYmZjMzUyMjVmMGJjMjEuYmluZFBvcHVwKHBvcHVwXzc2ODI5MDllMTBjYjQ3YjRiZmRjYzdjN2YwNzJiYjJlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyXzI1ZjY2MjY0ZDgzZTRlN2Y5ZmU5NTU3ODc3ZTk2N2ZjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMjM4OTg4NDc4MzMwNDUsIDEyOC44Nzc2NjY2NzYxNTI5XSwKICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzg1OWNiM2U2ZGQ5NzQwMGU5MTllNDBkMTUyNTAzZjRmKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgaWNvbl82YzQ4MzM5M2NhZTk0MmU3ODY5YjUzNjEyYmMzNzZhNyA9IEwuQXdlc29tZU1hcmtlcnMuaWNvbigKICAgICAgICAgICAgICAgIHsiZXh0cmFDbGFzc2VzIjogImZhLXJvdGF0ZS0wIiwgImljb24iOiAiZ2x5cGhpY29uIGdseXBoaWNvbi1jdXRsZXJ5IiwgImljb25Db2xvciI6ICJ3aGl0ZSIsICJtYXJrZXJDb2xvciI6ICJsaWdodHJlZCIsICJwcmVmaXgiOiAiZ2x5cGhpY29uIn0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWFya2VyXzI1ZjY2MjY0ZDgzZTRlN2Y5ZmU5NTU3ODc3ZTk2N2ZjLnNldEljb24oaWNvbl82YzQ4MzM5M2NhZTk0MmU3ODY5YjUzNjEyYmMzNzZhNyk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzc4YmE1ZGQzMGQ1NGE1YjhlNmQyZDYyNGY3NzQzZDggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2QyMzgxOGEwZmQyNTQzZThiY2RhMThiYjJiM2EzMmNiID0gJChgPGRpdiBpZD0iaHRtbF9kMjM4MThhMGZkMjU0M2U4YmNkYTE4YmIyYjNhMzJjYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+64yA7ISx7KCQPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2M3OGJhNWRkMzBkNTRhNWI4ZTZkMmQ2MjRmNzc0M2Q4LnNldENvbnRlbnQoaHRtbF9kMjM4MThhMGZkMjU0M2U4YmNkYTE4YmIyYjNhMzJjYik7CiAgICAgICAgCgogICAgICAgIG1hcmtlcl8yNWY2NjI2NGQ4M2U0ZTdmOWZlOTU1Nzg3N2U5NjdmYy5iaW5kUG9wdXAocG9wdXBfYzc4YmE1ZGQzMGQ1NGE1YjhlNmQyZDYyNGY3NzQzZDgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAo8L3NjcmlwdD4=&quot; style=&quot;position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;매장명, 주소, 번호, 위,경도를 한번에 묶은 리스트 생성&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;jangmonimlist=list()
for i in range(0,len(namelist)):
    shoplist=list()
    shoplist.append(namelist[i])
    shoplist.append(addrlist[i])
    shoplist.append(numlist[i])
    shoplist.append(ylist[i])
    shoplist.append(xlist[i])
    jangmonimlist.append(shoplist)

jangmonimlist[0:3]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[&amp;#39;금남점&amp;#39;,
  &amp;#39;경남 하동군 금남면 경남 하동군 금남면 사궁길 11&amp;#39;,
  &amp;#39;055-884-0133&amp;#39;,
  &amp;#39;34.997222823762385&amp;#39;,
  &amp;#39;127.81083722826276&amp;#39;],
 [&amp;#39;신안점&amp;#39;,
  &amp;#39;경상남도 진주시 신안동 13-14 1층&amp;#39;,
  &amp;#39;055-476-0677&amp;#39;,
  &amp;#39;35.18668688904107&amp;#39;,
  &amp;#39;128.0700231286068&amp;#39;],
 [&amp;#39;길곡점&amp;#39;,
  &amp;#39;경상남도 창녕군 길곡면 증산리 701&amp;#39;,
  &amp;#39;055-536-0890&amp;#39;,
  &amp;#39;35.38543320023189&amp;#39;,
  &amp;#39;128.57029654588757&amp;#39;]&lt;/code&gt;&lt;/pre&gt;&lt;h5&gt;뽑아오기 편하게 딕셔너리형태로도 만들어서 리스트에 담아봄&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;jangmonimdict = list()

for i in range(0,len(namelist)):
    kyodict=dict()
    kyodict[&amp;#39;매장명&amp;#39;]=namelist[i]
    kyodict[&amp;#39;매장주소&amp;#39;]=addrlist[i]
    kyodict[&amp;#39;매장번호&amp;#39;]=numlist[i]
    kyodict[&amp;#39;y&amp;#39;]=ylist[i]
    kyodict[&amp;#39;x&amp;#39;]=xlist[i]
    jangmonimdict.append(kyodict)
jangmonimdict[0]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{&amp;#39;매장명&amp;#39;: &amp;#39;금남점&amp;#39;,
  &amp;#39;매장주소&amp;#39;: &amp;#39;경남 하동군 금남면 경남 하동군 금남면 사궁길 11&amp;#39;,
  &amp;#39;매장번호&amp;#39;: &amp;#39;055-884-0133&amp;#39;,
  &amp;#39;y&amp;#39;: &amp;#39;34.997222823762385&amp;#39;,
  &amp;#39;x&amp;#39;: &amp;#39;127.81083722826276&amp;#39;}&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;잘 담겨있다.&lt;/li&gt;
&lt;li&gt;매장정보를 각각 피클, json, sqlite의 형태로 저장해보기로 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pytofile&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# pytofile.to_csv(jangmonimlist, data_type = &amp;#39;list&amp;#39;, file_name = &amp;#39;jangmonimcsv&amp;#39;, headers = False, save_time = True)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# pytofile.to_json(jangmonimdict, file_name = &amp;#39;jangmonim_j&amp;#39;, save_time = True)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# pytofile.to_pickle(jangmonimlist, file_name = &amp;#39;jangmonim_p&amp;#39;, save_time = True)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# pytofile.to_sqlitedb(jangmonimlist, dbname = &amp;#39;chicken&amp;#39;, tbname = &amp;#39;jangmonim&amp;#39; )&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pandas as pd
import sqlite3&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;conn = sqlite3.connect(&amp;#39;chicken.sqlite&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;pd.read_sql(&amp;#39;select * from jangmonim&amp;#39;,conn)&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;style scoped&gt;
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }


&lt;pre&gt;&lt;code&gt;.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/style&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
    &lt;tr style=&quot;text-align: right;&quot;&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;th&gt;4&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;0&lt;/th&gt;
      &lt;td&gt;금남점&lt;/td&gt;
      &lt;td&gt;경남 하동군 금남면 경남 하동군 금남면 사궁길 11&lt;/td&gt;
      &lt;td&gt;055-884-0133&lt;/td&gt;
      &lt;td&gt;34.997222823762385&lt;/td&gt;
      &lt;td&gt;127.81083722826276&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;1&lt;/th&gt;
      &lt;td&gt;신안점&lt;/td&gt;
      &lt;td&gt;경상남도 진주시 신안동 13-14 1층&lt;/td&gt;
      &lt;td&gt;055-476-0677&lt;/td&gt;
      &lt;td&gt;35.18668688904107&lt;/td&gt;
      &lt;td&gt;128.0700231286068&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;2&lt;/th&gt;
      &lt;td&gt;길곡점&lt;/td&gt;
      &lt;td&gt;경상남도 창녕군 길곡면 증산리 701&lt;/td&gt;
      &lt;td&gt;055-536-0890&lt;/td&gt;
      &lt;td&gt;35.38543320023189&lt;/td&gt;
      &lt;td&gt;128.57029654588757&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;3&lt;/th&gt;
      &lt;td&gt;곤양점&lt;/td&gt;
      &lt;td&gt;경남 사천시 곤양면 성내리 105&lt;/td&gt;
      &lt;td&gt;055-853-9982&lt;/td&gt;
      &lt;td&gt;35.057397970480785&lt;/td&gt;
      &lt;td&gt;127.9616792035626&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;4&lt;/th&gt;
      &lt;td&gt;진동점&lt;/td&gt;
      &lt;td&gt;경상남도 창원시 마산합포구 진동면 진북산업로 36&lt;/td&gt;
      &lt;td&gt;055-271-9191&lt;/td&gt;
      &lt;td&gt;35.11910826176575&lt;/td&gt;
      &lt;td&gt;128.48831516975162&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;5&lt;/th&gt;
      &lt;td&gt;김해부원점&lt;/td&gt;
      &lt;td&gt;김해시 호계로 451-1&lt;/td&gt;
      &lt;td&gt;055-338-9959&lt;/td&gt;
      &lt;td&gt;35.23077944027312&lt;/td&gt;
      &lt;td&gt;128.88445840668962&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;6&lt;/th&gt;
      &lt;td&gt;신기점&lt;/td&gt;
      &lt;td&gt;경남 양산시 고향의봄로 30&lt;/td&gt;
      &lt;td&gt;055-363-9985&lt;/td&gt;
      &lt;td&gt;35.35283737892165&lt;/td&gt;
      &lt;td&gt;129.04670975437634&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;7&lt;/th&gt;
      &lt;td&gt;안하점&lt;/td&gt;
      &lt;td&gt;경상남도 김해시 한림면 명동로 176&lt;/td&gt;
      &lt;td&gt;055-343-0014&lt;/td&gt;
      &lt;td&gt;35.30543262191181&lt;/td&gt;
      &lt;td&gt;128.82409333933978&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;8&lt;/th&gt;
      &lt;td&gt;대지점&lt;/td&gt;
      &lt;td&gt;경상남도 창녕군 대지면 모산리 506-4&lt;/td&gt;
      &lt;td&gt;055-533-9298&lt;/td&gt;
      &lt;td&gt;35.555649668771125&lt;/td&gt;
      &lt;td&gt;128.46691067859578&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;9&lt;/th&gt;
      &lt;td&gt;신촌점&lt;/td&gt;
      &lt;td&gt;경남 창원시 성산구 신촌로 7&lt;/td&gt;
      &lt;td&gt;055-286-3884&lt;/td&gt;
      &lt;td&gt;35.20859172846706&lt;/td&gt;
      &lt;td&gt;128.62648738554293&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;10&lt;/th&gt;
      &lt;td&gt;구산점&lt;/td&gt;
      &lt;td&gt;경상남도 김해시 구산동 257 백조아파트상가 18호&lt;/td&gt;
      &lt;td&gt;055-321-7701&lt;/td&gt;
      &lt;td&gt;35.2450789507104&lt;/td&gt;
      &lt;td&gt;128.87404578621673&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;11&lt;/th&gt;
      &lt;td&gt;악양점&lt;/td&gt;
      &lt;td&gt;경상남도 하동군 악양면 정서리 악양동로 379-5&lt;/td&gt;
      &lt;td&gt;055-883-8857&lt;/td&gt;
      &lt;td&gt;35.16149127528984&lt;/td&gt;
      &lt;td&gt;127.70957453412707&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;12&lt;/th&gt;
      &lt;td&gt;남해대교점&lt;/td&gt;
      &lt;td&gt;경남 하동군 금남면 구노량길46&lt;/td&gt;
      &lt;td&gt;055-883-5220&lt;/td&gt;
      &lt;td&gt;34.94867164042356&lt;/td&gt;
      &lt;td&gt;127.87732435020564&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;13&lt;/th&gt;
      &lt;td&gt;생림점&lt;/td&gt;
      &lt;td&gt;경남 김해시 생림면 봉림리 569-2&lt;/td&gt;
      &lt;td&gt;055=321-9422&lt;/td&gt;
      &lt;td&gt;35.326013709381364&lt;/td&gt;
      &lt;td&gt;128.8491300615257&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;14&lt;/th&gt;
      &lt;td&gt;자은점&lt;/td&gt;
      &lt;td&gt;경남 창원시 진해구 자은동 663-8번지 1층&lt;/td&gt;
      &lt;td&gt;055-547-9948&lt;/td&gt;
      &lt;td&gt;35.14145438253037&lt;/td&gt;
      &lt;td&gt;128.7050679885661&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;15&lt;/th&gt;
      &lt;td&gt;북면점&lt;/td&gt;
      &lt;td&gt;경남 창원시 의창구 북면 천주로 1075 1층&lt;/td&gt;
      &lt;td&gt;055-298-6409&lt;/td&gt;
      &lt;td&gt;35.34668093892348&lt;/td&gt;
      &lt;td&gt;128.60730959184065&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;16&lt;/th&gt;
      &lt;td&gt;초동점&lt;/td&gt;
      &lt;td&gt;경남 밀양시 초동면 초동로 310번지&lt;/td&gt;
      &lt;td&gt;055-391-2118&lt;/td&gt;
      &lt;td&gt;35.41194297381232&lt;/td&gt;
      &lt;td&gt;128.69045784279953&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;17&lt;/th&gt;
      &lt;td&gt;양보점&lt;/td&gt;
      &lt;td&gt;경남 하동군 양보면 진양로 736-1&lt;/td&gt;
      &lt;td&gt;055-884-7311&lt;/td&gt;
      &lt;td&gt;35.047264326430955&lt;/td&gt;
      &lt;td&gt;127.8453739484121&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;18&lt;/th&gt;
      &lt;td&gt;안의점&lt;/td&gt;
      &lt;td&gt;경남 함양군 안의면 종로길 1&lt;/td&gt;
      &lt;td&gt;055-962-9982&lt;/td&gt;
      &lt;td&gt;35.62837528236298&lt;/td&gt;
      &lt;td&gt;127.81245855305465&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;19&lt;/th&gt;
      &lt;td&gt;쌍책점&lt;/td&gt;
      &lt;td&gt;경남 합천군 쌍책면 성산리 622&lt;/td&gt;
      &lt;td&gt;055-933-9958&lt;/td&gt;
      &lt;td&gt;35.577703909948255&lt;/td&gt;
      &lt;td&gt;128.28300922511463&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;20&lt;/th&gt;
      &lt;td&gt;반지점&lt;/td&gt;
      &lt;td&gt;경남 창원시 의창구 봉곡동 140-1&lt;/td&gt;
      &lt;td&gt;055-276-2028&lt;/td&gt;
      &lt;td&gt;35.246339622930535&lt;/td&gt;
      &lt;td&gt;128.67112720703497&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;21&lt;/th&gt;
      &lt;td&gt;해금강점&lt;/td&gt;
      &lt;td&gt;경남 거제시 남부면 갈곶리 336-2&lt;/td&gt;
      &lt;td&gt;055-636-3567&lt;/td&gt;
      &lt;td&gt;34.740710150889356&lt;/td&gt;
      &lt;td&gt;128.66045474362997&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;22&lt;/th&gt;
      &lt;td&gt;학동점&lt;/td&gt;
      &lt;td&gt;경남 거제시 동부면 학동6길 18&lt;/td&gt;
      &lt;td&gt;055-636-1925&lt;/td&gt;
      &lt;td&gt;34.77336491546449&lt;/td&gt;
      &lt;td&gt;128.64029448370238&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;23&lt;/th&gt;
      &lt;td&gt;지수점&lt;/td&gt;
      &lt;td&gt;경남 진주시 지수면 지수로 470 장모님치킨 지수점&lt;/td&gt;
      &lt;td&gt;055-763-9982&lt;/td&gt;
      &lt;td&gt;35.23354790273804&lt;/td&gt;
      &lt;td&gt;128.26950796407775&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;24&lt;/th&gt;
      &lt;td&gt;감계화천점&lt;/td&gt;
      &lt;td&gt;경남 창원시 의창구 북면 천주로 470 1층&lt;/td&gt;
      &lt;td&gt;055-291-9984&lt;/td&gt;
      &lt;td&gt;35.29862884065675&lt;/td&gt;
      &lt;td&gt;128.6039929648051&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;25&lt;/th&gt;
      &lt;td&gt;마산직영점&lt;/td&gt;
      &lt;td&gt;창원시 마산합포구 문화의길 36(오동동)&lt;/td&gt;
      &lt;td&gt;055-247-9985&lt;/td&gt;
      &lt;td&gt;35.20705948423982&lt;/td&gt;
      &lt;td&gt;128.5782958835337&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;26&lt;/th&gt;
      &lt;td&gt;봉산점&lt;/td&gt;
      &lt;td&gt;경남 합천군 봉산면 김봉리 337-6&lt;/td&gt;
      &lt;td&gt;055-933-0092&lt;/td&gt;
      &lt;td&gt;35.62780725059026&lt;/td&gt;
      &lt;td&gt;128.04260798440362&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;27&lt;/th&gt;
      &lt;td&gt;수동점&lt;/td&gt;
      &lt;td&gt;경상남도 함양군 수동면 수동길 22 (화산리)&lt;/td&gt;
      &lt;td&gt;055-964-9985&lt;/td&gt;
      &lt;td&gt;35.52166326331872&lt;/td&gt;
      &lt;td&gt;127.78718972767423&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;28&lt;/th&gt;
      &lt;td&gt;가조점&lt;/td&gt;
      &lt;td&gt;경남 거창군 가조면 마상리 183-14&lt;/td&gt;
      &lt;td&gt;055-943-9982&lt;/td&gt;
      &lt;td&gt;35.708186609913675&lt;/td&gt;
      &lt;td&gt;128.0156314752431&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;29&lt;/th&gt;
      &lt;td&gt;주공점&lt;/td&gt;
      &lt;td&gt;경남 거창군 거창읍 대동리 95-11&lt;/td&gt;
      &lt;td&gt;055-942-6677&lt;/td&gt;
      &lt;td&gt;35.68897162738545&lt;/td&gt;
      &lt;td&gt;127.92398761327473&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;...&lt;/th&gt;
      &lt;td&gt;...&lt;/td&gt;
      &lt;td&gt;...&lt;/td&gt;
      &lt;td&gt;...&lt;/td&gt;
      &lt;td&gt;...&lt;/td&gt;
      &lt;td&gt;...&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;94&lt;/th&gt;
      &lt;td&gt;장군점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산합포구 장군동4가 22-5번지&lt;/td&gt;
      &lt;td&gt;055-246-0117&lt;/td&gt;
      &lt;td&gt;35.197084766768974&lt;/td&gt;
      &lt;td&gt;128.5641152200635&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;95&lt;/th&gt;
      &lt;td&gt;자산점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산합포구 자산동 299-100&lt;/td&gt;
      &lt;td&gt;055-247-4988&lt;/td&gt;
      &lt;td&gt;35.203115642644015&lt;/td&gt;
      &lt;td&gt;128.5660843197401&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;96&lt;/th&gt;
      &lt;td&gt;회원·교방점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산합포구 교방동 196-16&lt;/td&gt;
      &lt;td&gt;055-248-5006&lt;/td&gt;
      &lt;td&gt;35.21100586241153&lt;/td&gt;
      &lt;td&gt;128.5664423055509&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;97&lt;/th&gt;
      &lt;td&gt;호계코오롱점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 내서읍 호계리 53 한백상가 104&lt;/td&gt;
      &lt;td&gt;055-232-9921&lt;/td&gt;
      &lt;td&gt;35.267287822796625&lt;/td&gt;
      &lt;td&gt;128.52340713550447&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;98&lt;/th&gt;
      &lt;td&gt;중리점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 내서읍 호원로 186&lt;/td&gt;
      &lt;td&gt;055-231-0880&lt;/td&gt;
      &lt;td&gt;35.25065470855706&lt;/td&gt;
      &lt;td&gt;128.5225377166821&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;99&lt;/th&gt;
      &lt;td&gt;삼계점&lt;/td&gt;
      &lt;td&gt;경상남도 창원시 마산회원구 내서읍 삼계9길 49-1 (삼계리) 101동 1층 2호 ...&lt;/td&gt;
      &lt;td&gt;055-231-7272&lt;/td&gt;
      &lt;td&gt;35.23241833577125&lt;/td&gt;
      &lt;td&gt;128.49847538027606&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;100&lt;/th&gt;
      &lt;td&gt;상곡점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 내서읍 중리상곡로5&lt;/td&gt;
      &lt;td&gt;055-231-9981&lt;/td&gt;
      &lt;td&gt;35.24303301888093&lt;/td&gt;
      &lt;td&gt;128.50328463298814&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;101&lt;/th&gt;
      &lt;td&gt;덕재점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 구암서2길 24&lt;/td&gt;
      &lt;td&gt;055-297-1225&lt;/td&gt;
      &lt;td&gt;35.24741150605199&lt;/td&gt;
      &lt;td&gt;128.59053395594273&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;102&lt;/th&gt;
      &lt;td&gt;합성점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 합성동 694-1&lt;/td&gt;
      &lt;td&gt;055-292-0330&lt;/td&gt;
      &lt;td&gt;35.23945026281868&lt;/td&gt;
      &lt;td&gt;128.57881784820574&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;103&lt;/th&gt;
      &lt;td&gt;동마산점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 합성동 351-24&lt;/td&gt;
      &lt;td&gt;055-297-6976&lt;/td&gt;
      &lt;td&gt;35.23618711382796&lt;/td&gt;
      &lt;td&gt;128.58768725004597&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;104&lt;/th&gt;
      &lt;td&gt;소계.구암점&lt;/td&gt;
      &lt;td&gt;경남 창원시 의창구 소계로 79,1층(소계동)&lt;/td&gt;
      &lt;td&gt;055-299-2668&lt;/td&gt;
      &lt;td&gt;35.2564415820645&lt;/td&gt;
      &lt;td&gt;128.59957493072065&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;105&lt;/th&gt;
      &lt;td&gt;봉암.양덕1점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 봉암동 454-3&lt;/td&gt;
      &lt;td&gt;055-297-0152 / 055-292-2168&lt;/td&gt;
      &lt;td&gt;35.222283794709064&lt;/td&gt;
      &lt;td&gt;128.59720850611814&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;106&lt;/th&gt;
      &lt;td&gt;양덕.한일점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 양덕동 63-10&lt;/td&gt;
      &lt;td&gt;055-294-2323 / 055-296-3601&lt;/td&gt;
      &lt;td&gt;35.23066044399119&lt;/td&gt;
      &lt;td&gt;128.58220625870058&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;107&lt;/th&gt;
      &lt;td&gt;서마산회성점&lt;/td&gt;
      &lt;td&gt;경남 창원시 마산회원구 회성동 467-24번지&lt;/td&gt;
      &lt;td&gt;055-256-3180&lt;/td&gt;
      &lt;td&gt;35.231558340332&lt;/td&gt;
      &lt;td&gt;128.56555443694825&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;108&lt;/th&gt;
      &lt;td&gt;삼랑진점&lt;/td&gt;
      &lt;td&gt;밀양시 삼랑진읍 송지리 156-115&lt;/td&gt;
      &lt;td&gt;055-352-9833&lt;/td&gt;
      &lt;td&gt;35.399729598560974&lt;/td&gt;
      &lt;td&gt;128.8411135867331&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;109&lt;/th&gt;
      &lt;td&gt;수산점&lt;/td&gt;
      &lt;td&gt;경남 밀양시 하남읍 수산리 449-11&lt;/td&gt;
      &lt;td&gt;055-391-0019&lt;/td&gt;
      &lt;td&gt;35.374717260430764&lt;/td&gt;
      &lt;td&gt;128.70960978055203&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;110&lt;/th&gt;
      &lt;td&gt;부북점&lt;/td&gt;
      &lt;td&gt;경남 밀양시 부북면 운전리 485-6&lt;/td&gt;
      &lt;td&gt;055-355-2791&lt;/td&gt;
      &lt;td&gt;35.51084270336593&lt;/td&gt;
      &lt;td&gt;128.72935440759886&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;111&lt;/th&gt;
      &lt;td&gt;산내점&lt;/td&gt;
      &lt;td&gt;경남 밀양시 산내면 송백리 1349-11&lt;/td&gt;
      &lt;td&gt;055-352-6454&lt;/td&gt;
      &lt;td&gt;35.585200082303&lt;/td&gt;
      &lt;td&gt;128.8809210768754&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;112&lt;/th&gt;
      &lt;td&gt;남명점&lt;/td&gt;
      &lt;td&gt;경남 밀양시 산내면 남명리 1116-4&lt;/td&gt;
      &lt;td&gt;055-352-6454&lt;/td&gt;
      &lt;td&gt;35.58779943985804&lt;/td&gt;
      &lt;td&gt;128.95293568171863&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;113&lt;/th&gt;
      &lt;td&gt;신도시점&lt;/td&gt;
      &lt;td&gt;경상남도 양산시 중부동 696-1&lt;/td&gt;
      &lt;td&gt;055-367-9989&lt;/td&gt;
      &lt;td&gt;35.33824692131217&lt;/td&gt;
      &lt;td&gt;129.03385292180388&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;114&lt;/th&gt;
      &lt;td&gt;웅상점&lt;/td&gt;
      &lt;td&gt;경남 양산시 소주동 147-1&lt;/td&gt;
      &lt;td&gt;055-362-9292&lt;/td&gt;
      &lt;td&gt;35.410389096320785&lt;/td&gt;
      &lt;td&gt;129.15979415004935&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;115&lt;/th&gt;
      &lt;td&gt;북부점&lt;/td&gt;
      &lt;td&gt;경남 양산시 북부동 480-21&lt;/td&gt;
      &lt;td&gt;055-381-9995&lt;/td&gt;
      &lt;td&gt;35.3469280701833&lt;/td&gt;
      &lt;td&gt;129.0369830227265&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;116&lt;/th&gt;
      &lt;td&gt;외동점&lt;/td&gt;
      &lt;td&gt;경남 김해시 외동 705-1 동성아파트상가 7&lt;/td&gt;
      &lt;td&gt;055-326-2888&lt;/td&gt;
      &lt;td&gt;35.23543346997759&lt;/td&gt;
      &lt;td&gt;128.85175053941&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;117&lt;/th&gt;
      &lt;td&gt;오거리점&lt;/td&gt;
      &lt;td&gt;경남 김해시 대동면 덕산리 750-2번지&lt;/td&gt;
      &lt;td&gt;055-323-0280&lt;/td&gt;
      &lt;td&gt;35.28179239881222&lt;/td&gt;
      &lt;td&gt;128.9801762626616&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;118&lt;/th&gt;
      &lt;td&gt;진례점&lt;/td&gt;
      &lt;td&gt;경남 김해시 진례면 송정리 234&lt;/td&gt;
      &lt;td&gt;055-345-5635&lt;/td&gt;
      &lt;td&gt;35.24832306548616&lt;/td&gt;
      &lt;td&gt;128.74861462542458&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;119&lt;/th&gt;
      &lt;td&gt;한림점&lt;/td&gt;
      &lt;td&gt;경남 김해시 한림면 가동리 660&lt;/td&gt;
      &lt;td&gt;055-345-2131&lt;/td&gt;
      &lt;td&gt;35.32112569231001&lt;/td&gt;
      &lt;td&gt;128.76572023534865&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;120&lt;/th&gt;
      &lt;td&gt;장유점&lt;/td&gt;
      &lt;td&gt;경남 김해시 장유면 무계리 196-4번지 1층&lt;/td&gt;
      &lt;td&gt;055-328-9985&lt;/td&gt;
      &lt;td&gt;35.200711842407486&lt;/td&gt;
      &lt;td&gt;128.81537133357273&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;121&lt;/th&gt;
      &lt;td&gt;진영점&lt;/td&gt;
      &lt;td&gt;경남 김해시 진영읍 여래리 448-11&lt;/td&gt;
      &lt;td&gt;055-343-5611&lt;/td&gt;
      &lt;td&gt;35.30258499110249&lt;/td&gt;
      &lt;td&gt;128.73769783281085&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;122&lt;/th&gt;
      &lt;td&gt;동김해점&lt;/td&gt;
      &lt;td&gt;경남 김해시 지내동 67 동원APT 상가 11-107호&lt;/td&gt;
      &lt;td&gt;055-329-3459&lt;/td&gt;
      &lt;td&gt;35.23035212439192&lt;/td&gt;
      &lt;td&gt;128.92375502076317&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;123&lt;/th&gt;
      &lt;td&gt;대성점&lt;/td&gt;
      &lt;td&gt;경남 김해시 대성동 135-14&lt;/td&gt;
      &lt;td&gt;055-332-5196&lt;/td&gt;
      &lt;td&gt;35.23898847833045&lt;/td&gt;
      &lt;td&gt;128.8776666761529&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;124 rows × 5 columns&lt;/p&gt;

&lt;/div&gt;




&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# pytofile.to_tinydb(jangmonimdict, dbname = &amp;#39;chicken&amp;#39;, tbname = &amp;#39;jangmonim&amp;#39;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>folium</category>
      <category>Python</category>
      <author>bo보bo</author>
      <guid isPermaLink="true">https://bobo0829.tistory.com/4</guid>
      <comments>https://bobo0829.tistory.com/4#entry4comment</comments>
      <pubDate>Wed, 5 Feb 2020 03:14:01 +0900</pubDate>
    </item>
    <item>
      <title>서울시 범죄관련 데이터 간단 분석 및 시각화 프로젝트</title>
      <link>https://bobo0829.tistory.com/3</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2020.1.29&lt;/li&gt;
&lt;li&gt;python , django사용&lt;/li&gt;
&lt;li&gt;웹을 이용한 시각화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://khs0806.pythonanywhere.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://khs0806.pythonanywhere.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1580899755200&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;빅파이팀의 범죄분석&quot; data-og-description=&quot;프로젝트목표 매체를 통해 범죄를 더 자주 접하게 된 현대. 이런 현대 사회에서 범죄와 관련된 데이터들을 모아 분석해보고, 제일 인구가 밀집해 있는 서울시로 한정하여 분석을 실시하여, 범죄율과 관련이 높은 변수들을 알아내고, 이를 바탕으로 범죄율을 낮추는 방안을 탐색해본다. 개요 2015-2018 서울시 구별 범죄관련 분석 및 시각화 - 구별 범죄발생/검거율과 다양한 변수 간 상관분석 - 서울시 내 경찰서(치안센터까지) 위치 지도에 표시 - 연도별/구별 토&quot; data-og-host=&quot;khs0806.pythonanywhere.com&quot; data-og-source-url=&quot;http://khs0806.pythonanywhere.com/&quot; data-og-url=&quot;http://khs0806.pythonanywhere.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bItJho/hyEP1xDh9B/DHoeX8jmgb8pKgg93PSkb1/img.jpg?width=2513&amp;amp;height=524&amp;amp;face=0_0_2513_524,https://scrap.kakaocdn.net/dn/bBkRGv/hyEO9cYZ4O/hFbdc3HOWfafK23dYqAX7k/img.png?width=2513&amp;amp;height=524&amp;amp;face=0_0_2513_524&quot;&gt;&lt;a href=&quot;http://khs0806.pythonanywhere.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://khs0806.pythonanywhere.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bItJho/hyEP1xDh9B/DHoeX8jmgb8pKgg93PSkb1/img.jpg?width=2513&amp;amp;height=524&amp;amp;face=0_0_2513_524,https://scrap.kakaocdn.net/dn/bBkRGv/hyEO9cYZ4O/hFbdc3HOWfafK23dYqAX7k/img.png?width=2513&amp;amp;height=524&amp;amp;face=0_0_2513_524');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;빅파이팀의 범죄분석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;프로젝트목표 매체를 통해 범죄를 더 자주 접하게 된 현대. 이런 현대 사회에서 범죄와 관련된 데이터들을 모아 분석해보고, 제일 인구가 밀집해 있는 서울시로 한정하여 분석을 실시하여, 범죄율과 관련이 높은 변수들을 알아내고, 이를 바탕으로 범죄율을 낮추는 방안을 탐색해본다. 개요 2015-2018 서울시 구별 범죄관련 분석 및 시각화 - 구별 범죄발생/검거율과 다양한 변수 간 상관분석 - 서울시 내 경찰서(치안센터까지) 위치 지도에 표시 - 연도별/구별 토&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;khs0806.pythonanywhere.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;policemap.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFiRrL/btqBMObLq3h/Lcfs3NBCKpydORwoppUKM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFiRrL/btqBMObLq3h/Lcfs3NBCKpydORwoppUKM1/img.png&quot; data-alt=&quot;서울시 구별 경찰서 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFiRrL/btqBMObLq3h/Lcfs3NBCKpydORwoppUKM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFiRrL%2FbtqBMObLq3h%2FLcfs3NBCKpydORwoppUKM1%2Fimg.png&quot; data-filename=&quot;policemap.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;563&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서울시 구별 경찰서 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>bo보bo</author>
      <guid isPermaLink="true">https://bobo0829.tistory.com/3</guid>
      <comments>https://bobo0829.tistory.com/3#entry3comment</comments>
      <pubDate>Tue, 4 Feb 2020 17:07:05 +0900</pubDate>
    </item>
  </channel>
</rss>